c# – 停止线程,ManualResetEvent,volatile boolean或cancellati
我在
Windows服务中有一个Thread(STAThread),它执行大量工作.重新启动Windows服务时,我想优雅地停止此线程.
我知道几种方法 >一个不稳定的布尔值 据我所知,Thread.Abort是不行的…… 什么是最佳做法? 更新 Class Scheduler{ private Thread apartmentThread; private Worker worker; void Scheduling(){ worker = new Worker(); apartmentThread = new Thread(Run); apartmentThread.SetApartmentState(ApartmentState.STA); apartmentThread.Start(); } private void Run() { while (!token.IsCancellationRequested) { Thread.Sleep(pollInterval * MillisecondsToSeconds); if (!token.IsCancellationRequested) { worker.DoWork(); } } } } Class Worker{ //This will take several minutes.... public void DoWork(){ for(int i = 0; i < 50000; i++){ //Do some work including communication with a COM interface //Communication with COM interface doesn't take long } } } UPDATE 解决方法
您尚未发布足够的实施内容,但如果您可以使用,我强烈建议您使用CancellationToken.从可维护性的角度来看,使用和理解它非常简单.如果您决定拥有多个工作线程,也可以设置合作取消.
如果您发现自己处于此线程可能长时间阻塞的情况,最好设置您的体系结构,以便不会发生这种情况.当你告诉他们停止时,你不应该开始那些不会很好玩的线程.如果他们在你问他们时没有停止,那么唯一真正的方法是拆除这个过程并让操作系统杀死他们. Eric Lippert在一个有点相关的问题here上发布了一个很棒的答案. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |