线程在暂停后重新启动



我在代码中使用线程,线程是使用函数创建的

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();
}

我取消线程是否正确?当他们被取消时,我在列表框中看到一行说线程被取消了,所以它确实转到了取消代码,但过了一段时间后它重新启动了

感谢

我不认为你真的理解BackgroundWorkerDoWork事件处理程序应该是一个工作单元的处理程序。CCD_ 3是用一个线程调用的。从DoWork处理程序中调用CancelAsync是没有意义的——它独立于任何其他BackgroundWorker。在DoWork处理程序中,它应该只检查一个CancellationPending,即发送方的(一旦转换为BackgroundWorker,在您的情况下为worker)。

但是,除此之外,从UI调用CancelAsync是取消特定BackgroundWorker的正确方法。

后台工作人员不是"线程"。你不是在取消线程,而是在取消工作者——这让DoWork处理程序有机会在工作完成之前退出。

最新更新