以下代码的缺点是,在主线程重置等待句柄后,工作线程既不会立即终止,也不会执行最终操作。相反,它将继续做它正在做的事情,直到它到达循环的下一次迭代,此时它将被无限期地阻塞。
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 任务的解决方案)