Backgroundworker中止

Maz*_*arD 9 c# backgroundworker winforms

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

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

Rob*_*Rob 5

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

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();
Run Code Online (Sandbox Code Playgroud)

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

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


Don*_*ter 2

我不太确定您想要完成什么,但也许SerialPort.DataReceived事件是更好的解决方案?

如果您已经精通线程的使用,那么我不认为使用BackgroundWorker有什么意义。它是为那些一开始就不懂线程的人设计的。

此外,我不喜欢中止线程的想法。这感觉很危险,多线程应用程序不需要再冒险了。

  • 关于BackgroundWorker 的评论几乎被诱惑到-1;它旨在强制执行一些标准并自动将事件编组到 UI 线程,这是其使用的正当理由;不理解线程无论你走哪条路都会导致问题。 (10认同)