到目前为止,为了将sync
方法改为async
,我一直想弄清楚:
private async void RefreshScreen()
{
await System.Threading.Tasks.Task.Run(() =>
{
this.refreshContent();
this.refreshTokens();
}
);
}
无论如何都没有以更优雅的方式获得它?
修改
正如您可以看出RefreshContent()
和RefreshTokens()
参与多次调用网络服务。
此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
是否已满,我都要返回所有元素。
我不知道我是否解释得那么好。
答案 0 :(得分:3)
您正在接近问题&#34;向后&#34;。你应该从另一端开始,而不是试图弄清楚如何使这种方法成为异步&#34 ;.
例如,refreshContent
做什么?它是否执行一些速度很慢的I / O,可能会遇到Web API或数据库?然后从这些低级Web /数据库调用开始。使那些异步第一个(HttpClient
和实体框架都具有内置的异步支持)。然后await
这些来电,让async
从那里开始。
如果采用这种方法,编译器会指导您,例如,当您添加Task
时,它会建议您将返回类型更改为Task<T>
/ async
。正如其他人所说,你应该avoid async void
。您也不需要使用Task.Run
,除非您正在执行需要卸载的大量CPU操作。
最终,您最终会得到一个async Task RefreshScreen
,您可以从async void
事件处理程序调用该文件。