2017-01-12 57 views
-1

據我一直在爲了出一本sync方法async弄清楚:使用,而不是同步異步方法一個

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

是不是有反正開始使用它更優雅的方式?

編輯

正如你可以找出RefreshContent()RefreshTokens()從事幾個調用web服務。

此WebService客戶端實現提供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是否fullfilled。

我不知道我是否解釋得很好。

+6

如果不是「事件處理程序」,則使用'Task'而不是'void'。 –

+0

爲什麼使用'Task'而不是'void'更合適?你能提供任何樣品嗎? – Jordi

+2

示例:在'Task.Run'內放置'拋出新的Exception()',然後在某處執行'RefreshScreen' - 並且您注意到沒有拋出異常 – Fabio

回答

3

您正在向「回退」問題靠近。與其試圖弄清楚如何「使這種方法異步」,你應該從另一端開始。

例如,refreshContent是做什麼的?它是否執行了一些速度很慢的I/O,可能會觸及Web API或數據庫?然後,您開始使用這些低級別的Web /數據庫調用。使這些異步第一個HttpClient和實體框架都有內置的異步支持)。然後await這些電話,並讓async從那裏增長。

如果您採用這種方法,編譯器會引導您,例如,如果您添加async,它會建議您將返回類型更改爲Task/Task<T>。正如其他人指出的,你應該avoid async void。除非您正在執行一些需要卸載的CPU繁重操作,否則您也不需要使用Task.Run

最終,您最終會得到一個async Task RefreshScreen,您可以從async void事件處理函數中調用該函數。

+0

謝謝@Stephen。我編輯了這篇文章。我用另一種方法提出了問題.... – Jordi