Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是后台工作人员';s和“s”一样忙;“我活着”吗;?_C#_Winforms_.net 4.0_Backgroundworker_Watchdog - Fatal编程技术网

C# 是后台工作人员';s和“s”一样忙;“我活着”吗;?

C# 是后台工作人员';s和“s”一样忙;“我活着”吗;?,c#,winforms,.net-4.0,backgroundworker,watchdog,C#,Winforms,.net 4.0,Backgroundworker,Watchdog,我正试图找出一种方法来验证BackgroundWorker线程是否处于活动状态(即仍在运行)。该线程基本上实现为一个简单的无限循环: while (AllConditionsMet()) { DoSomeMagic(); Thread.Sleep(10000); } yourBackgroundWorker.CancelAsync(); 到目前为止,我发现最接近IsAlive()的是这个属性,但是考虑到我的线程Sleep()大部分时间都在运行,我不确定这是否能完成任务 yourBac

我正试图找出一种方法来验证BackgroundWorker线程是否处于活动状态(即仍在运行)。该线程基本上实现为一个简单的无限循环:

while (AllConditionsMet())
{
  DoSomeMagic();
  Thread.Sleep(10000);
}
yourBackgroundWorker.CancelAsync();
到目前为止,我发现最接近IsAlive()的是这个属性,但是考虑到我的线程Sleep()大部分时间都在运行,我不确定这是否能完成任务

yourBackgroundWorker.CancelAsync();
我能指望做些什么吗

yourBackgroundWorker.CancelAsync();
还是我在找麻烦?

来自:

yourBackgroundWorker.CancelAsync();
true,如果BackgroundWorker正在运行异步操作;否则,false

yourBackgroundWorker.CancelAsync();

无论您是否休眠工作线程,它仍在执行某些操作,因此使用
IsBusy
应该可以。

要确保Backgroundworker真正停止,可以手动将其杀死。
yourBackgroundWorker.CancelAsync();
设置
yourBackgroundWorker.WorkerSupportsCancellation=true;
。 然后简单地用以下方法停止Backgroundworker:

yourBackgroundWorker.CancelAsync();

仍然
isBusy
应该足以检测您的
BackgroundWorker
BackgroundWorker的运行/工作实例。只要DoWork事件处理程序忙且RunWorkerCompleted事件处理程序尚未运行,isBusy
就是真的。请注意后一个子句,该属性没有运行>not告诉您循环是否处于活动状态

yourBackgroundWorker.CancelAsync();

此外,在您的第二个代码片段中有一个相当恶劣的竞争条件语句,但一个月后是错误的。一个月一次命中的种族。代码的意图很难从难以处理的片断中找到。考虑一下总是创建一个新的BGW对象,它永远不会竞争。也有助于摆脱这个循环,一个10秒的线程浪费了一个非常大的EXP。在不执行任何操作的情况下保存系统资源。这会破坏线程池计划程序。

创建一个布尔变量,在backgroundworker开始运行时将该变量设置为true,在backgroundworker完成后将该布尔变量设置为false。检查布尔变量状态,它可以显示backgroundworker是否仍在运行ely.

如果isBusy为false,则Backgroundworker没有执行任何操作,因此使用所示代码不会给您带来麻烦。只有方法“RestartWorker()”是错误的,因为工作线程尚未启动。但这更多的是语言问题,而不是编程问题。如果在线程中实现代码以重新启动自身,则会自找麻烦。最好是检测失败情况,结束该线程并重新启动一个全新的线程。否则很可能会出现deaDeLink情况。考虑使用“等待任务。Delay(10000)”,而不是线程。睡眠,它可能会实现相同的目标,同时对其他事物的影响较小。
yourBackgroundWorker.CancelAsync();