1

ここでは、複数backgroundworkerの を使用して 1 つのネットワーク関連の操作を行っています。基本的には、ユーザーがマイページに登録されているかどうかを確認するプロセスです。チェックするアカウントが1000近くあるためdatagridview、ユーザーをインポートし、チェック目的で同じユーザー名を取得するために使用しています。私のコードは正常に動作し、結果を表示しますが、問題はステータスを更新するときにdatagridviewそれほど効果的ではありません。その長いプロセスメソッドでは、メソッドのすべてのプロセスのステータステキストを設定していましたlogin process started logged in failed to login.ButBackgroundworkerはステータス列を更新しません。backgroundworkerすべてが完了した後のステータスを表示するだけです。各アカウントのステータスを更新する方法を教えてください。前もって感謝します

それは私のコードです:

int threadNum;
    public  BackgroundWorker bcheker;
    private void toolStripButton2_Click(object sender, EventArgs e)
    {
        if (wbcheckStatus == WorkerStatus.NotStarted || wblogcheckStatus == WorkerStatus.Completed)
        {
            threadNum = -1;
            SetControlsStatus(ProgramStatus.BChecking);
            toolStripButton2.Image = aTumblr.Properties.Resources.control_stop;
            for (int i = 0; i < 4; i++)
            {
                bcheker = new BackgroundWorker();
                bcheker.DoWork += new DoWorkEventHandler(bcheker_dowork);
                bcheker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bchecker_completed);
                bcheker.ProgressChanged +=bcheker_ProgressChanged;
                bcheker.WorkerReportsProgress = true;
                bcheker.WorkerSupportsCancellation = true;
                bcheker.RunWorkerAsync();
            }
        }
        else
        {
            threadNum = 10000;
            bcheker.CancelAsync();
            SetControlsStatus(ProgramStatus.BlogChecking);
        }
    }       
    public void bcheker_dowork(object sender, DoWorkEventArgs e)
    {
        while (!bcheker.CancellationPending)
        {
            int rownum = Interlocked.Increment(ref threadNum);
            if (rownum >= bchecktableModel.Rows.Count)
            {
                break;
            }
            Thread.Sleep(1000);
            BlogChecker bc = new BlogChecker(bchecktableModel[rownum, 1].Text, bchecktableModel[rownum, 2]);
            bc.check();                
            wblogcheckStatus = WorkerStatus.Running;

        }
        if (bcheker.CancellationPending)
        {
            wblogcheckStatus = WorkerStatus.Completed;
            SetControlsStatus(ProgramStatus.BCheckingDone);

        }
    }

    public void bcheker_ProgressChanged(Object sender, ProgressChangedEventArgs e)
    {

    }

    public void bchecker_completed(object sender, EventArgs e)
    {
        if (threadNum == bchecktableModel.Rows.Count+1)
        {
            SetControlsStatus(ProgramStatus.BCheckingDone);

            wblogcheckStatus = WorkerStatus.Completed;
        }
    }
4

2 に答える 2

0

また、DoWork() メソッドでは、最後に作成された BackgroundWorker を参照するだけなので、「bcheker」を使用しないでください。代わりに、sender パラメーターをローカルの BackgroundWorker 変数にキャストし、それを使用します。

于 2013-10-18T05:23:11.970 に答える
0

まず、複数のハンドラーが DoWorkEvent に登録するという問題があるようです。
何が起こっているのかわかりませんが、bcheker_doworkメソッドが呼び出されている回数を確認します。

進行状況を報告するには、BackgroundWorker.ReportProgressメソッドを使用します。

public void bcheker_ProgressChanged(Object sender, ProgressChangedEventArgs e)
{
    //Update your progress here
}
于 2013-10-18T05:17:46.167 に答える