保持 Backgroundworker 存活
Keep Backgroundworker alive
我有一个调用异步方法的 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
关键字,它允许使用更强大的语法来执行异步操作操作,如果你愿意的话。
我有一个调用异步方法的 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
关键字,它允许使用更强大的语法来执行异步操作操作,如果你愿意的话。