1

//これは私のコードです

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 を実行中に value dispose を呼び出すことはできません」というエラーが表示されました。これとともに。

4

1 に答える 1

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

アップデート

明示的WorkerFactoryにこのようなことをします

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

    return worker;
}
于 2013-04-12T07:59:39.787 に答える