以下代码的缺点是工作线程不会立即终止,也不会在主线程重置等待句柄后执行最终操作。相反,它将继续做它正在做的事情,直到它到达循环的下一次迭代,此时它将被无限期地阻塞。
static void Main()
{
ManualResetEvent m = new ManualResetEvent(true); // or bool b = true
Thread thread = new Thread(new ThreadStart(delegate()
{
while(m.WaitOne()) //or while(b)
{
//do something
}
//perform final operation and exit
}));
thread.Start();
//do something
m.Reset(); //or b = false
//do something else
}
下面的代码有一个缺点,它使用了 Abort() 方法(有些人说应该不惜一切代价避免它),但它完成了我正在寻找的东西:强制工作线程中断一旦主线程告诉它这样做,循环就会执行最后的操作,然后退出。
static void Main()
{
Thread thread = new Thread(new ThreadStart(delegate()
{
try
{
while(true)
{
//do something
}
}
catch(ThreadAbortException e)
{
//perform final operation and exit
}
}));
thread.Start();
//do something
thread.Abort();
//do something else
}
由于这两种解决方案都不理想,实现我正在寻找的功能的正确方法是什么?
(我更喜欢不涉及 .net 4.5 任务的解决方案)
最佳答案
您可以使用BackgroundWorker
static void Main()
{
BackgroundWorker worker = new BackgroundWorker();
worker.DoWork += worker_DoWork;
worker.RunWorkerAsync();
// do something
worker.CancelAsync();
// do something else
}
void worker_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker worker = sender as BackgroundWorker;
while(!worker.CancellationPending)
{
// do something
}
// perform final action
}
(代码未经测试)
关于c# - 告诉正在执行循环的线程跳出循环并执行其他操作的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14528032/