簡體   English   中英

使用backgroundworker時出錯

[英]Error on using backgroundworker

//這是我的代碼

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時不能調用值處理”。,請幫助我有了這個。

在開始執行任務之前,我總是會創建一個新的工作人員。 這樣可以避免這些問題。

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完成,並且不會出現討厭的IsBusy軟糖。

更新

明確地, WorkerFactory做這樣的事情

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

    return worker;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM