[英]Use an async method instead of a sync one
到目前为止,我一直想弄清楚是为了async
的sync
方法:
private async void RefreshScreen()
{
await System.Threading.Tasks.Task.Run(() =>
{
this.refreshContent();
this.refreshTokens();
}
);
}
反正不是有一种更优雅的方式来获得它?
编辑
如您RefreshTokens()
, RefreshContent()
和RefreshTokens()
参与了对Web服务的多次调用。
此Web服务客户端实现提供了调用方法的sync
和async
方式:
public async System.Threading.Tasks.Task<string> GetUrlAsync ()
{
ApiResponse<string> localVarResponse = await GetUrlAsyncWithHttpInfo();
return localVarResponse.Data;
}
public string GetUrl ()
{
ApiResponse<string> localVarResponse = GetUrlWithHttpInfo();
return localVarResponse.Data;
}
当前,我们正在使用"sync"
方法,当然,我们希望继续使用async
调用。
例:
public Enumerable<Element> GatherElements()
{
return yield new Element() {
Field1 = RESTClient.GetMethod1(),
Field2 = RESTClient.GetMethod2(),
Field3 = RESTClient.GetMethod3(),
Field4 = RESTClient.GetMethod4(),
Field5 = RESTClient.GetMethod5(),
Field6 = RESTClient.GetMethod6(),
Field7 = RESTClient.GetMethod7()
};
}
我不想等到所有剩余调用都完成后,才想返回所有元素,而不管每个Field
是否已满。
我不知道我的解释是否很好。
您正在“向后”解决问题。 与其尝试弄清楚如何“使此方法异步”,不如从另一端开始。
例如, refreshContent
做什么? 它执行的I / O速度是否很慢,可能会影响Web API或数据库? 然后,从这些低级的Web /数据库调用开始。 让那些异步第一 (两者HttpClient
和Entity Framework具有内置的异步支持)。 然后await
这些呼叫,并让async
从那里开始。
如果采用这种方法,编译器将指导您,例如,建议您在添加async
时将返回类型更改为Task
/ Task<T>
。 正如其他人指出的那样,您应该避免async void
。 您也不需要使用Task.Run
除非您正在执行一些需要卸载的CPU繁重的操作。
最终,您将获得一个async Task RefreshScreen
,您可以从一个async void
事件处理程序中调用它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.