Killing.NETThread我创建了一个运行某种方法的线程。但有时我想杀死线程,即使它还在工作。我怎样才能做到这一点?我尝试了Thread.Abort(),但它显??示了一个消息框,上面写着“Threadhasbeenaborted”。我该怎么办?不要调用Thread.Abort()!Thread.Abort是危险的。相反,您应该与线程合作,以便它可以和平关闭。线程需要设计成可以告诉它杀死自己,例如,当您希望线程停止时,您可以设置一个布尔值keepGoing标志,并将其设置为false。然后线程会有类似while(keepGoing){/*Dowork的东西。*/}如果线程可能在Sleep或Wait中阻塞,则可以通过调用Thread.Interrupt()将其从这些函数中分离出来。然后线程应该准备好处理ThreadInterruptedException:try{while(keepGoing){/*做工作。*/}}catch(ThreadInterruptedException异常){/*清理。*/}你应该只调用Abort()作为最后的手段。你可以使用一个变量来同步这个线程:volatileboolshutdown=false;voidRunThread(){while(!shutdown){...}}voidStopThread(){shutdown=true;这允许您的线程干净利落地完成您正在做的事情,以使您的应用程序处于已知的良好状态。最正确和线程安全的方法是使用WaitHandle在线程应该停止时向线程发出信号。我主要使用ManualResetEvent。在您的主题中,您可以:privatevoidRunThread(){while(!this.flag.WaitOne(TimeSpan.FromMilliseconds(100))){//...}}其中this.flag是ManualResetEvent的实例。这意味着您可以从线程外部调用this.flag.Set()来停止循环。WaitOne方法仅在设置标志时返回true。否则,它将在指定的超时时间(示例中为100毫秒)后超时,并且线程将再次运行循环。杀死一个帖子不是一个好主意。最好发出停止信号,让它优雅地结束。有多种不同的方法可以做到这一点。我不必重新审视如何使用每种方法,因为我已经在这个答案中这样做了。中止线程是一个非常糟糕的主意,因为您无法确定线程中止时正在做什么。相反,有一个线程可以检查的属性,您的外部代码可以设置。让线程在安全的地方退出时检查这个布尔属性。我同意JonBvolatileboolshutdown=false;voidRunThread(){try{while(!shutdown){/*工作。*/}}catch(ThreadAbortException异常){/*清理。*/}}voidStopThread(){shutdown=true;}还有一个在我的WebServer类中杀死线程的例子...https://net7ntcip.codeplex.com/SourceControl/changeset/view/89621#1752948我想说Abort是可以的,只要你明白什么是结果...只要您在长时间运行的任务工作之前指示状态中止,但需要标志,例如(ShouldStop或ActionBranch等),请查看示例!以上就是《C#学习教程:杀死.NET线程》分享的全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右边联系管理员删除。如需转载请注明出处:
