使用异步方法而不是同步方法

时间:2017-01-12 12:52:07

标签: c# asynchronous

到目前为止,为了将sync方法改为async,我一直想弄清楚:

private async void RefreshScreen()
{
    await System.Threading.Tasks.Task.Run(() =>
        {
            this.refreshContent();
            this.refreshTokens();
        }
    );
}

无论如何都没有以更优雅的方式获得它?

修改

正如您可以看出RefreshContent()RefreshTokens()参与多次调用网络服务。

此Web服务客户端实现提供syncasync方法来调用方法:

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是否已满,我都要返回所有元素。

我不知道我是否解释得那么好。

1 个答案:

答案 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事件处理程序调用该文件。