我最近尝试使用backgroundworker而不是"经典"线程,我意识到它至少对我来说,比解决方案更多的问题.我有一个后台工作程序运行同步读取(在这种情况下来自serialPort)并在1个代码行中被阻止大约30秒,然后取消支持不是解决方案.我看到如果应用程序此时关闭(使用十字按钮和Application.Exit()),该过程将永远保持僵尸.
我需要一种强制中止或杀死backgroundworker线程的方法.
我把一个放在一起(我认为)完成这项工作.如果我等了,请告诉我.这是一个简单的例子,它是如何运作的.
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基本上运行,直到子线程完成或我们发信号通知它终止进程.然后,后台工作线程可以返回读池.通常我会将它包装在一个帮助器类中,并传递我希望后台线程作为参数传入的委托方法,并在子线程中运行它.
请有人让我知道,如果我把头撞在墙上,但似乎工作正常..但这就是线程的问题不是它...当你在不同的时间运行时可以获得不同的结果.