Is BackgroundWorker's IsBusy same as “IsAlive”?

谁都会走 提交于 2019-12-05 04:51:55
Hans Passant

BackgroundWorker.IsBusy is true as long as the DoWork event handler is busy and the RunWorkerCompleted event handler hasn't been run yet. Do note the latter clause, the property does not tell you if your loop is active.

Furthermore, there's a fairly nasty race condition in your second snippet. IsBusy might be true in the if() statement but be false a nanosecond later. The kind of race that strikes once a month. The intent of the code is hard to fathom from the snippets so hard to give a workaround. Consider just always creating a new BGW object, that will never race. Also helps getting rid of that loop, a thread sleeping for 10 seconds is wasting a very expensive system resource on doing nothing. And it gums-up the threadpool scheduler.

To make sure the Backgroundworker really stopped, you can kill it manually. Set yourBackgroundWorker.WorkerSupportsCancellation = true;. Then simply stop the Backgroundworker with:

yourBackgroundWorker.CancelAsync();

Still isBusy should be enough to detect a running/working instance of your BackgroundWorker.

From the docs:

true, if the BackgroundWorker is running an asynchronous operation; otherwise, false.

Regardless if you sleep the worker thread or not, it's still doing something so using IsBusy should be fine.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!