如何在C#中立即杀死一个线程?
我正在使用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
是我的全球线程。
杀死一个线程很困难的原因是因为语言devise者想要避免以下问题:你的线程需要一个锁,然后在它释放之前杀掉它。 现在任何需要这把锁的人都会被困住。
你必须做的是使用一些全局variables来告诉线程停止。 你必须在你的线程代码中手动检查这个全局variables,如果你看到这个全局variables的话就表明你应该停止。
你可以通过这种方式即时杀死:
private Thread _myThread = new Thread(SomeThreadMethod); private void SomeThreadMethod() { // do whatever you want } [SecurityPermissionAttribute(SecurityAction.Demand, ControlThread = true)] private void KillTheThread() { _myThread.Abort(); }
我总是使用它,为我工作:)
你应该先有一些约定的方法来结束这个线程。 例如线程可以检查并遵守的running_valiable。
您的主线程代码应该包装在一个exception块中,该exception块会捕获ThreadInterruptException和ThreadAbortException,它们将在退出时清理整理线程。
在ThreadInterruptException的情况下,您可以检查running_variables以查看是否应该继续。 在ThreadAbortException的情况下,你应该立即整理并退出线程程序。
试图停止线程的代码应执行以下操作:
running_ = false; threadInstance_.Interrupt(); if(!threadInstance_.Join(2000)) { // or an agreed resonable time threadInstance_.Abort(); }
线程在完成工作时会被终止,所以如果你正在使用循环或者其他的东西,你应该把variables传递给线程来停止循环。
C#Thread.Abort不保证立即中止线程。 当一个线程本身调用Abort时,它可能会工作,但是当一个线程调用另一个线程时不会。
请参阅文档: http : //msdn.microsoft.com/en-us/library/ty8d3wta.aspx
我遇到了这个问题,编写与硬件交互的工具 – 你想立即停止,但不能保证。 我通常使用一些标志或其他这样的逻辑,以防止在线程上运行的代码部分执行(我不想在中止执行 – 棘手)。
private void ResumeButton_Click(object sender, RoutedEventArgs e) { Task.Factory.StartNew(() => { Application.Current.Resources["AutoPilotThreadStatus"] = true; Thread.CurrentThread.Name = "ResumeAutoPilot"; Thread.CurrentThread.IsBackground = true; AutoPilotHandler.ResumeAutoPilot(); }); } public static void ResumeAutoPilot() { while ((bool)Application.Current.Resources["AutoPilotThreadStatus"]) { CheckAutoPilotThreadStatus(); var searchYoutube = YoutubeHandler.Search("small truck"); CheckAutoPilotThreadStatus(); SaveVideosToDatabase(searchYoutube); CheckAutoPilotThreadStatus(); } } public static void CheckAutoPilotThreadStatus() { if (!(bool)Application.Current.Resources["AutoPilotThreadStatus"]) { KillCurrentThread(); } } public static void KillCurrentThread() { Thread.CurrentThread.Abort(); }