让后台工作者活着

本文关键字:活着 工作者 后台 | 更新日期: 2023-09-27 18:11:00

我有一个调用异步方法的BackgroundWorker。async方法提供了一个回调参数,让我知道它已经完成了。

//Bunch of stuff to prep for the call happens first
SomeAsyncMethodIn3rdPartyDll(callback);
//A few more clean up operations after the call

我的问题是BackgroundWorker在回调调用之前完成,因此它永远不会被调用,因为线程是死的。

我目前的(工作)解决方案是在我的DoWork方法的末尾添加这个:

      while (keepAlive)
      {
        Application.DoEvents();
        System.Threading.Thread.Sleep(100);
      }

然后,当我收到回调时,我简单地将keepAlive的值设置为false。

这看起来很糟糕,特别是使用Application.DoEvents()命令时,它需要触发回调。

所以,我想知道的是:有没有更好的方法来保持线程存活?或者,我可以指定要处理哪些消息而不是DoEvents(它处理所有消息)吗?还有别的办法吗?

让后台工作者活着

你根本不应该使用BackroundWorker。BGW用于在另一个线程中执行CPU绑定工作。您正在尝试调用异步操作。干脆彻底废弃BGW吧。在UI线程中启动异步操作,并在回调方法中完成该操作后执行任何需要执行的操作。

如果您愿意,可以使用任务并行库将异步操作封装在Task中,因为与await关键字结合使用,如果您愿意,它允许更强大的语法来执行异步操作。