C# 让幕后工作人员活着

C# 让幕后工作人员活着,c#,multithreading,backgroundworker,C#,Multithreading,Backgroundworker,我有一个调用异步方法的BackgroundWorker。async方法提供了一个回调参数,让我知道它已经完成 //Bunch of stuff to prep for the call happens first SomeAsyncMethodIn3rdPartyDll(callback); //A few more clean up operations after the call 我遇到的问题是,BackgroundWorker在调用回调之前完成,因此它永远不会被调用,因为线程是死的 我

我有一个调用异步方法的
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
(哪些处理所有消息)?还有其他解决方案吗?

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


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

Hmm,这必须是一个COM组件,才能像这样工作。BGW对于这样的组件来说是一个非常危险的地方,你真的应该避免它。考虑到它支持回调,常规UI线程应该已经足够好了。如果没有,那么一定要为组件创建一个快乐的家。不要急于终止它。有很多事情要做,以准备对异步方法的调用。在UI线程上运行这些线程不是一个选项。我还没有深入到任务并行库中,但是,我可以将异步调用包装到任务中并等待来自我的BGW线程吗?@MikeH如果您使用TPL,那么您不需要BGW,您只需等待准备工作,然后等待异步操作,然后等待清理工作。如果没有TPL,您将在另一个线程中运行准备工作,然后启动异步工作,然后在回调中启动另一个线程来执行清理工作。异步编程就是这样工作的。