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

ymzxtsji  于 2023-10-23  发布在  C#
关注(0)|答案(5)|浏览(192)

我正在使用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是我的全局线程。

cyej8jka

cyej8jka1#

你应该首先有一些商定的结束线程的方法。例如,线程可以检查并遵守running_valable。
你的主线程代码应该被 Package 在一个异常块中,该异常块捕获ThreadInterruptException和ThreadAbortException,这将在退出时清理线程。
在ThreadInterruptException的情况下,您可以检查running_ variable以查看是否应该继续。在ThreadAbortException的情况下,您应该立即清理并退出线程过程。
尝试停止线程的代码应执行以下操作:

running_ = false;
threadInstance_.Interrupt();
if(!threadInstance_.Join(2000)) { // or an agreed resonable time
   threadInstance_.Abort();
}
2q5ifsrm

2q5ifsrm2#

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

dffbzjpn

dffbzjpn3#

C# Thread.Abort不保证立即中止线程。当一个线程调用自己的Abort时,它可能会工作,但当一个线程调用另一个线程时,它就不工作了。
请参阅文档:http://msdn.microsoft.com/en-us/library/ty8d3wta.aspx
我在编写与硬件交互的工具时遇到过这个问题--你想立即停止,但不能保证。我通常使用一些标志或其他类似的逻辑来防止执行在线程上运行的部分代码(我不希望在异常终止时执行)。

xienkqul

xienkqul4#

很难直接杀死一个线程的原因是因为语言设计者想要避免以下问题:你的线程获取一个锁,然后在它释放它之前杀死它。现在任何需要锁的人都会被卡住。
你要做的是使用一些全局变量来告诉线程停止。你必须在你的线程代码中手动检查这个全局变量,如果你看到它指示你应该停止,就返回。

ecr0jaav

ecr0jaav5#

你可以用这种方式立即杀死它:

private Thread _myThread = new Thread(SomeThreadMethod);

private void SomeThreadMethod()
{
   // do whatever you want
}

[SecurityPermissionAttribute(SecurityAction.Demand, ControlThread = true)]
private void KillTheThread()
{
   _myThread.Abort();
}

我总是用它,为我工作:)

相关问题