我最近尝试使用后台工作程序而不是“经典”线程,我意识到至少对我来说,它造成的问题多于解决方案。
我有一个后台工作人员运行同步读取(在本例中是从串行端口)并在 1 行代码中被阻塞大约 30 秒,然后取消挂起不是解决方案。我看到,如果应用程序此时关闭(使用十字按钮和 Application.Exit()),则进程将永远保持僵尸状态。
我需要一种方法来强制中止或终止后台工作线程。
我把一个组合在一起(我认为)可以完成这项工作。如果我不在,请告诉我。
这是一个简单的例子来说明它是如何工作的。
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 基本上会运行,直到子线程完成或我们向它发出信号以终止进程。然后后台工作线程可以返回到读取池中。通常,我会将其包装在一个帮助程序类中,并传递我希望后台线程运行的委托方法作为参数传入,并在子线程中运行该方法。
如果我用头撞墙,请有人告诉我,但它似乎工作正常。但这就是线程的问题不是吗。当你在不同时间运行它时,你会得到不同的结果。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)