使用backgroundworker时出错

时间:2013-04-12 06:16:29

标签: c#

//这是我的代码

private void btnGenSumm_Click(object sender, EventArgs e)
{
    if (backgroundWorker1.IsBusy != true)
    {
        btnGenSumm.Enabled = false;
        btnExpSum.Enabled = false;
        btnClose.Enabled = false;
        pBox1.Visible = true;
        backgroundWorker1.RunWorkerAsync();
    }
}

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
        BackgroundWorker worker = sender as BackgroundWorker;
        loadSummSales(); // this is the process
        System.Threading.Thread.Sleep(50);
}

private void backgroundWorker1_RunWorkerCompleted(object sender, 
    RunWorkerCompletedEventArgs e)
{
        pBox1.Visible = false;
}

第一次单击时执行进程没有错误,但是当我尝试再次单击命令按钮(btnGenSumm)重复进程时,我收到错误“在执行createhandle时无法调用值dispose”。请帮帮我。

1 个答案:

答案 0 :(得分:0)

我会在开始任务之前创建一个新工人;这避免了这些问题。

private void btnGenSumm_Click(object sender, EventArgs e)
{
    // WorkerFactory creates your worker and hooks up the DoWork 
    // and RunWorkerCompleted events
    var backgroundWorker1 = WorkerFactory();

    // ...
    // Disable access to this Click event in the UI here

    backgroundWorker1.RunWorkerAsync();
}

private void backgroundWorker1_RunWorkerCompleted(
    object sender, 
    RunWorkerCompletedEventArgs e)
{
    // Re-enable access to the Click event in the UI here
}

使用这种方法,工作人员无法在其运行时访问,并且无论何时用户单击按钮,最后一名工作人员已完成并且没有令人讨厌的IsBusy软糖。 / p>

<强>更新

明确WorkerFactory做类似的事情

private BackgroundWorker WorkerFactory()
{
    var worker = new BackgroundWorker();
    worker.DoWork += backgroundWorker1_DoWork;
    worker.RunWorkerCompleted += backgroundWorker1_RunWorkerCompleted;

    return worker;
}