如何在C#中立即杀死一个线程?

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

杀死一个线程很难的原因是因为语言设计者想要避免以下问题:你的线程会锁定,然后在它释放它之前杀死它.现在任何需要锁定的人都会被卡住.

你要做的是使用一些全局变量来告诉线程停止.您必须在线程代码中手动检查全局变量并返回,如果您看到它表明您应该停止.

  • 如果可能,请使用ManualResetEvent而不是变量,这是它们的设计目的. (5认同)
  • 我现在很好奇 - 如果检查提前终止条件,ManualResetEvent将如何优越?我知道当我们不得不阻止某事时它们会更好,但这里没有阻止. (3认同)

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)

我总是使用它并为我工作:)

  • [Adrian Regan的答案](http://stackoverflow.com/a/1327377/199364)使用"Abort"是一种更安全的方式 - 如果线程没有死亡,则作为最后的手段. (2认同)

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)

  • 从我的角度来看,这是唯一可以接受的答案.是的,你首先需要一个变量来记录线程何时可以退出,但如果你在线程内部阻塞,你可能永远不会有机会检查该变量.需要另一种方法来中断被阻止的线程,这个答案解决了我的问题.谢谢! (4认同)

Wae*_*oul 8

线程将在完成它的工作时被杀死,所以如果你正在使用循环或其他东西,你应该将变量传递给线程以在线程完成之后停止循环.


Ses*_*esh 5

不保证C#Thread.Abort会立即中止线程。当一个线程自身调用Abort而不是一个线程调用另一个线程时,它可能会起作用。

请参考文档:http : //msdn.microsoft.com/en-us/library/ty8d3wta.aspx

我遇到了与硬件交互的编写工具的问题-您想立即停止,但不能保证。我通常使用一些标志或其他这样的逻辑来防止执行在线程上运行的部分代码(并且我不想在中止时执行-棘手的)。