0

コードでスレッドを使用しています。スレッドは関数を使用して作成されます:

private void InitializeBackgoundWorkers()
{

    for (int f = 0; f < maxThreads; f++)
    {
        listBox1.Items.Insert(0, "Starting Thread : " + (f + 1));
        threadArray[f] = new BackgroundWorker();
        threadArray[f].DoWork +=
            new DoWorkEventHandler(backgroundWorkerFiles_DoWork);
        threadArray[f].RunWorkerCompleted +=
            new RunWorkerCompletedEventHandler(backgroundWorkerFiles_RunWorkerCompleted);
        threadArray[f].ProgressChanged +=
            new ProgressChangedEventHandler(backgroundWorkerFiles_ProgressChanged);
        threadArray[f].WorkerReportsProgress = true;
        threadArray[f].WorkerSupportsCancellation = true;

    }
}

そしてdoeventは次のようなものです:

private void backgroundWorkerFiles_DoWork(object sender, DoWorkEventArgs e)
{

    BackgroundWorker worker = sender as BackgroundWorker;

    int flag = 0;

    while (rowCounter < allPostingRows.Tables[0].Rows.Count && flag == 0)
    {

        for (int i = 0; i < maxThreads; i++)
        {

            if (threadArray[i].CancellationPending == true)
            {
                flag = 1;
                threadArray[i].CancelAsync();
                worker.ReportProgress(0, "Thread Paused:");
            }

        }

        if (flag == 0)
        {
             //perform work here
            }
    }
}

ボタンで、次を使用してスレッドをキャンセルしようとします。

for (int i = 0; i < maxThreads; i++)
{
    threadArray[i].CancelAsync();
}

スレッドを正しくキャンセルしていますか? それらがキャンセルされると、リストボックスにスレッドがキャンセルされたという行が表示されるので、キャンセルコードに移動しますが、しばらくすると再起動します

ありがとうございました

4

1 に答える 1

0

私はあなたが本当に理解しているとは思わないBackgroundWorkerDoWorkイベントハンドラーは、1つの作業単位のハンドラーであると想定されています 。DoWork1つのスレッドで呼び出されます。CancelAsyncハンドラー内から呼び出すことは意味がありませんDoWork-それは他のすべてのものから独立していBackgroundWorkerます。DoWorkハンドラー内ではCancellationPending、送信者の1つだけをチェックする必要があります(BackgroundWorkerあなたの場合、にキャストされたらworker)。

ただし、それ以外の場合CancelAsyncは、UIから呼び出すことが、特定のをキャンセルする正しい方法BackgroundWorkerです。

バックグラウンドワーカーは「スレッド」ではありません。スレッドをキャンセルするのではなく、ワーカーをキャンセルします。これにより、DoWorkハンドラーは、作業が完了する前に終了することができます。

于 2012-07-31T19:01:24.803 に答える