当前位置:  开发笔记 > 编程语言 > 正文

Backgroundworker中止

如何解决《Backgroundworker中止》经验,为你挑选了1个好方法。

我最近尝试使用backgroundworker而不是"经典"线程,我意识到它至少对我来说,比解决方案更多的问题.我有一个后台工作程序运行同步读取(在这种情况下来自serialPort)并在1个代码行中被阻止大约30秒,然后取消支持不是解决方案.我看到如果应用程序此时关闭(使用十字按钮和Application.Exit()),该过程将永远保持僵尸.

我需要一种强制中止或杀死backgroundworker线程的方法.



1> Rob..:

我把一个放在一起(我认为)完成这项工作.如果我等了,请告诉我.这是一个简单的例子,它是如何运作的.

var backgroundWorker = new BackgroundWorker(){WorkerSupportsCancellation = true};

backgroundWorker.DoWork += (sender, args) =>
         {                 
                 var thisWorker = sender as BackgroundWorker;
                 var _child = new Thread(() =>
                                               {
                                                   //..Do Some Code

                                               });
                 _child .Start();
                 while (_child.IsAlive)
                 {
                     if (thisWorker.CancellationPending)
                     {
                         _child.Abort();
                         args.Cancel = true;
                     }
                     Thread.SpinWait(1);
                 }                 
         };

 backgroundWorker.RunWorkerAsync(parameter);
 //..Do Something...
backgroundWorker.CancelAsync();

由于后台工作程序是线程池的一部分,我们不想中止它.但我们可以在内部运行一个线程,我们可以允许中止发生.然后,backgroundWorker基本上运行,直到子线程完成或我们发信号通知它终止进程.然后,后台工作线程可以返回读池.通常我会将它包装在一个帮助器类中,并传递我希望后台线程作为参数传入的委托方法,并在子线程中运行它.

请有人让我知道,如果我把头撞在墙上,但似乎工作正常..但这就是线程的问题不是它...当你在不同的时间运行时可以获得不同的结果.

推荐阅读
雨天是最美
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有