Jor*_*nco 19 c# multithreading abort
我创建了一个运行某种方法的线程.但有时我想杀死线程,即使它仍在工作.我怎样才能做到这一点?我尝试了Thread.Abort(),但它显示了一个消息框,说"线程已中止".我该怎么办?
Joh*_*ica 48
Thread.Abort()
!Thread.Abort
很危险 相反,你应该与线程合作,以便它可以安静地关闭.线程需要设计,以便可以告诉它自杀,例如,keepGoing
当你想要线程停止时,你设置一个布尔标志,你设置为假.然后线程会有类似的东西
while (keepGoing)
{
/* Do work. */
}
Run Code Online (Sandbox Code Playgroud)
如果线程可能阻塞在a中Sleep
,Wait
那么你可以通过调用将它从这些函数中分离出来Thread.Interrupt()
.然后应该准备线程来处理ThreadInterruptedException
:
try
{
while (keepGoing)
{
/* Do work. */
}
}
catch (ThreadInterruptedException exception)
{
/* Clean up. */
}
Run Code Online (Sandbox Code Playgroud)
Jon*_*n B 26
你应该只打电话给Abort()作为最后的手段.您可以使用变量来同步此线程:
volatile bool shutdown = false;
void RunThread()
{
while (!shutdown)
{
...
}
}
void StopThread()
{
shutdown = true;
}
Run Code Online (Sandbox Code Playgroud)
这允许您的线程干净地完成它正在做的事情,让您的应用程序处于已知的良好状态.
最正确和线程安全的方法是使用WaitHandle在它应该停止时向线程发出信号.我主要使用ManualResetEvent.
在你的主题中,你可以:
private void RunThread()
{
while(!this.flag.WaitOne(TimeSpan.FromMilliseconds(100)))
{
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
其中this.flag
是ManualResetEvent的实例.这意味着您可以this.flag.Set()
从线程外部调用以停止循环.
WaitOne方法仅在设置标志时返回true.否则,它将在指定的超时(示例中为100 ms)后超时,并且线程将再次运行循环.
归档时间: |
|
查看次数: |
66439 次 |
最近记录: |