我正在听一个关于UserControl(winform)的事件:
public void OnSomething(SomeEventArgs args){
SomeResult result = ?await? _businessObject.AsyncCall();
ApplySomethingOnTheGuiBasedOnTheResult(result);
}
_businessObject.AsyncCall()
具有以下签名:
public async Task<SomeResult> AsyncCall();
如何在以下情况下调用此异步方法:
ApplySomethingOnTheGuiBasedOnTheResult
ApplySomethingOnTheGuiBasedOnTheResult
。我尝试了什么:
public void OnSomething(SomeEventArgs args){
SomeResult result = await _businessObject.AsyncCall();
ApplySomethingOnTheGuiBasedOnTheResult(result);
}
- &GT;因为我的事件处理程序不是异步的,所以不编译。
public void OnSomething(SomeEventArgs args){
SomeResult result = _businessObject.AsyncCall().Result;
ApplySomethingOnTheGuiBasedOnTheResult(result);
}
- &GT;申请冻结
public void OnSomething(SomeEventArgs args){
_businessObject.AsyncCall().ContinueWith(t=>{
if(InvokeRequired){
Invoke(new Action(()=>ApplySomethingOnTheGuiBasedOnTheResult(t.Result)));
}
});
}
- &GT;工作,但我正在跳跃,有一个更好的方法来做async / await。
答案 0 :(得分:2)
您只需将处理程序标记为async
:
public async void OnSomething(SomeEventArgs args)
{
SomeResult result = await _businessObject.AsyncCall();
ApplySomethingOnTheGuiBasedOnTheResult(result);
}
我知道不建议asyc
使用返回类型void
(通常应为Task
或Task<sometype>
),但如果事件需要那个签名,这是唯一的方式。
这样,控制流将在await
语句处返回给调用者。当AsyncCall
完成后,最终在 UI线程上的await
之后恢复执行。