我正在使用thread.Abort
方法杀死线程,但它不起作用。是否有其他方法终止线程?
private void button1_Click(object sender, EventArgs e)
{
if (Receiver.IsAlive == true)
{
MessageBox.Show("Alive");
Receiver.Abort();
}
else
{
MessageBox.Show("Dead");
Receiver.Start();
}
}
我正在使用它,但每次我得到Alive
状态时,Receiver
是我的全局线程。
5条答案
按热度按时间cyej8jka1#
你应该首先有一些商定的结束线程的方法。例如,线程可以检查并遵守running_valable。
你的主线程代码应该被 Package 在一个异常块中,该异常块捕获ThreadInterruptException和ThreadAbortException,这将在退出时清理线程。
在ThreadInterruptException的情况下,您可以检查running_ variable以查看是否应该继续。在ThreadAbortException的情况下,您应该立即清理并退出线程过程。
尝试停止线程的代码应执行以下操作:
2q5ifsrm2#
当线程完成它的工作时,它将被杀死,所以如果你使用循环或其他东西,你应该向线程传递变量来停止循环。在此之后,线程将完成。
dffbzjpn3#
C# Thread.Abort不保证立即中止线程。当一个线程调用自己的Abort时,它可能会工作,但当一个线程调用另一个线程时,它就不工作了。
请参阅文档:http://msdn.microsoft.com/en-us/library/ty8d3wta.aspx
我在编写与硬件交互的工具时遇到过这个问题--你想立即停止,但不能保证。我通常使用一些标志或其他类似的逻辑来防止执行在线程上运行的部分代码(我不希望在异常终止时执行)。
xienkqul4#
很难直接杀死一个线程的原因是因为语言设计者想要避免以下问题:你的线程获取一个锁,然后在它释放它之前杀死它。现在任何需要锁的人都会被卡住。
你要做的是使用一些全局变量来告诉线程停止。你必须在你的线程代码中手动检查这个全局变量,如果你看到它指示你应该停止,就返回。
ecr0jaav5#
你可以用这种方式立即杀死它:
我总是用它,为我工作:)