Mob*_*bin 47 c# multithreading winforms
我正在使用该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();
}
}
Run Code Online (Sandbox Code Playgroud)
我正在使用它,但每次我获得Alive
状态,Receiver
都是我的全局线程.
red*_*una 68
杀死一个线程很难的原因是因为语言设计者想要避免以下问题:你的线程会锁定,然后在它释放它之前杀死它.现在任何需要锁定的人都会被卡住.
你要做的是使用一些全局变量来告诉线程停止.您必须在线程代码中手动检查全局变量并返回,如果您看到它表明您应该停止.
Nic*_*kon 32
您可以通过这种方式立即杀死它:
private Thread _myThread = new Thread(SomeThreadMethod);
private void SomeThreadMethod()
{
// do whatever you want
}
[SecurityPermissionAttribute(SecurityAction.Demand, ControlThread = true)]
private void KillTheThread()
{
_myThread.Abort();
}
Run Code Online (Sandbox Code Playgroud)
我总是使用它并为我工作:)
Adr*_*gan 20
你应该先得到一些结束线程的商定方法.例如,线程可以检查并遵守的running_valiable.
您的主线程代码应该包含在一个异常块中,该异常块捕获ThreadInterruptException和ThreadAbortException,它们将在退出时干净地整理线程.
在ThreadInterruptException的情况下,您可以检查running_变量以查看是否应该继续.在ThreadAbortException的情况下,您应该立即整理并退出线程过程.
尝试停止线程的代码应执行以下操作:
running_ = false;
threadInstance_.Interrupt();
if(!threadInstance_.Join(2000)) { // or an agreed resonable time
threadInstance_.Abort();
}
Run Code Online (Sandbox Code Playgroud)
不保证C#Thread.Abort会立即中止线程。当一个线程自身调用Abort而不是一个线程调用另一个线程时,它可能会起作用。
请参考文档:http : //msdn.microsoft.com/en-us/library/ty8d3wta.aspx
我遇到了与硬件交互的编写工具的问题-您想立即停止,但不能保证。我通常使用一些标志或其他这样的逻辑来防止执行在线程上运行的部分代码(并且我不想在中止时执行-棘手的)。