1

这里我使用多个backgroundworkers 来做一个网络相关的操作。基本上它是一个检查用户是否在我的页面上注册的过程。我有近 1000 个帐户要检查,因此我datagridview用来导入用户并从中获取用户名以进行检查。我的代码工作正常并显示结果,但问题是在更新状态时datagridview效果不是很好。在那个长过程方法中,我曾经为方法的每个过程设置状态文本,例如login process started logged in failed to login。但Backgroundworker不更新状态列。它仅显示所有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

首先,看起来您有多个处理程序注册到 DoWorkEvent 的问题。
我不确定发生了什么,但我会检查该bcheker_dowork方法被调用了多少次。

为了报告您的进度,请使用BackgroundWorker.ReportProgress方法。

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

此外,在您的 DoWork() 方法中,您不应该使用“bcheker”,因为它只会引用最后创建的 BackgroundWorker。相反,将 sender 参数转换为本地 BackgroundWorker 变量并使用它。

于 2013-10-18T05:23:11.970 回答