繁体   English   中英

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

[英]Use an async method instead of a sync one

到目前为止,我一直想弄清楚是为了asyncsync方法:

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

反正不是有一种更优雅的方式来获得它?

编辑

如您RefreshTokens()RefreshContent()RefreshTokens()参与了对Web服务的多次调用。

此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是否已满。

我不知道我的解释是否很好。

您正在“向后”解决问题。 与其尝试弄清楚如何“使此方法异步”,不如从另一端开始。

例如, 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM