我在代码中使用线程,线程是使用函数创建的:
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();
}
我是否正确取消了帖子?当他们被取消时我看到列表框中的行说线程被取消所以它确实转到取消代码但是一段时间后它重新启动
谢谢
答案 0 :(得分:0)
我认为你并不理解BackgroundWorker
。 DoWork
事件处理程序应该是一个工作单元的处理程序。用一个线程调用DoWork
。从CancelAsync
处理程序中调用DoWork
是没有意义的 - 它独立于任何和所有其他BackgroundWorker
。在DoWork
处理程序中,它应该只检查一个CancellationPending
,即发件人(一旦转为BackgroundWorker
,在您的情况下worker
)。
但是,否则,从用户界面调用CancelAsync
是取消特定BackgroundWorker
的正确方法。
后台工作者不是“线程”。你没有取消一个线程,你取消了工作 - 这使得DoWork处理程序有机会在它完成它之前退出。