繁体   English   中英

暂停后重新开始线程

[英]Threading start back again after pausing

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

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

我可以正确取消线程吗? 当他们被取消时,我看到列表框中的行说线程已取消,所以它确实进入了取消代码,但过了一段时间后重新启动

谢谢

我认为您不太了解BackgroundWorker DoWork事件处理程序应该是一个工作单元的处理程序。 用一个线程调用DoWork DoWork处理程序中调用CancelAsync是没有意义的-它独立于任何其他所有BackgroundWorker DoWork处理程序中,它应该只检查发送者的一个CancellationPending (一旦强制转换为BackgroundWorker ,在您的情况是worker )。

但是,否则,从UI调用CancelAsync是取消特定BackgroundWorker的正确方法。

后台工作者不是“线程”。 您不是在取消线程,而是在取消工作程序,这使DoWork处理程序有机会在完成工作之前退出。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM