我有一个简单的BackgroundWorker
应该可以生成结果,但是我不知道如何将它们返回到我的调用方法。
我已经阅读了许多答案,它们都向我展示了RunWorkerCompleted
事件如何可以接收DoWork
事件处理程序的结果,并且为了证明这一点,他们在结果中显示了一个消息框。一切都很好,但是如何将结果返回到称为RunWorkerAsync
的实际方法?
myResult=myBackGroundWorker.RunWorkerAsync(); // This obviously doesn't compile
这个答案特别有用:
How to make BackgroundWorker return an object
但是我仍然不知道如何访问结果。 此答案还提到了委托的使用:
BackgroundWorker Return A Value?
但是我不知道这是否可以解决我的问题,或者我是否仍然会在RunWorkCompleted事件处理程序中获取结果。
答案 0 :(得分:3)
简短的回答:您不能。
请考虑将值返回给称为RunWorkerAsync
的方法的含义。这意味着该方法必须暂停执行,等待后台工作人员完成其工作,然后再次继续。但是您仍然希望在等待期间运行其他方法,否则UI会冻结。
您听起来很熟悉吗?当遇到async
表达式时,这基本上就是await
方法的作用!
BackgroundWorker
是一个很老的API,它发布时并没有花哨的async / await功能(无论如何,async / await是 language 功能),这是为什么它使用事件来解决问题。那时,还没有一种方法可以异步进行操作,并且可以优雅地将值返回给调用方。
现在我们有了async / await,您可以使用它来执行您想要的操作:
someReuslt = await Task.Run(() => { ... });
如果您根本没有听说过异步/等待,那么this是一个不错的起点。