具有多个Backgroundworker C#的GUI更新

时间:2013-10-18 04:58:32

标签: c# user-interface backgroundworker

这里我使用多个backgroundworker来做一个与网络相关的操作。基本上它是一个检查用户的过程是否在我的页面注册。我要检查近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;
        }
    }

2 个答案:

答案 0 :(得分:0)

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

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

public void bcheker_ProgressChanged(Object sender, ProgressChangedEventArgs e)
{
    //Update your progress here
}

答案 1 :(得分:0)

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