线程暂停
我在我的代码使用线程后重新开始回来了,线程使用的函数创建:线程暂停
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
处理程序中调用CancelAsync
没有任何意义 - 它独立于任何和所有其他BackgroundWorker
的处理程序。在DoWork
处理程序中,它应该只检查一个CancellationPending
,发件人(一旦投到BackgroundWorker
,在您的案件worker
)。
但是,否则,从UI调用CancelAsync
是取消特定BackgroundWorker
的正确方法。
后台工作人员不是“线程”。您不会取消某个线程,您将取消该工作人员 - 这允许DoWork处理程序在完成工作之前有机会退出。
谢谢,我会给它一个去.... – confusedMind 2012-07-31 19:15:01
谢谢你的提示:)我得到它的工作方式,我想要的:))... – confusedMind 2012-07-31 20:26:37
工人们是怎么开始的?所有工人都重新启动吗他们是否从头开始重新开始? – ekholm 2012-07-31 13:35:57
@PeterRitchie我减少了所有额外的代码,并且现在对它做出了很好的简单的帮助? – confusedMind 2012-07-31 18:56:27