2013-02-28 50 views
3

在我的方法RecalcChartAsync我做了一些時間密集的東西..所以我想我會做一些異步的事情。async方法是否正確? Resharper警告

我想開始兩種方法CreateHistogramAsyncCalculatePropValuesAsync,同時在我的RecalcChartsAsync中做一些東西,最後等待它完成。

private async void RecalcChartsAsync() 
{ 
    var histogram = CreateHistogramAsync(); 
    var propValues = CalculatePropValuesAsync(); 

    //do some other stuff 

    await histogram; 
    await propValues; 
} 

private async Task CreateHistogramAsync() 
{ 
    //do some stuff 
} 

private async Task CalculatePropValuesAsync() 
{ 
    //do some stuff 
} 

林不知道如果我這樣做了正確的方式,因爲ReSharper的給我處CreateHistogramAsync和CalculatePropValueAsync async關鍵字以下警告:

這種異步方法缺乏「等待」運營商和意志同步運行。考慮使用await運算符來等待非阻塞API調用,...

現在我不確定是否以正確的方式使用此異步事件。

+0

執行異步方法時,始終返回任務。否則,你會失去與該方法的任何連接。這可能是問題,特別是在測試期間。 – Andree 2016-04-20 11:08:38

+0

此外,如果你想等待更多的任務完成,你可以使用'await Task.WhenAll(params Task [] tasks)' – Andree 2016-04-20 11:12:41

回答

9

現在我不知道如果我在正確的方式使用此異步的事情。

聽起來不像它。只是因爲你有一個async方法並不意味着它會在一個單獨的線程上運行 - 聽起來就是你所期望的。當您執行async方法時,它將同步運行 - 即與正常情況一樣 - 直到碰到第一個表達式await。如果你沒有任何await表達式,這意味着它只會像平常一樣運行,唯一的區別就是它在狀態機中包含的方式,以及由任務表示的完成狀態(異常等)。

我懷疑你應該改變你CreateHistogramAsyncCalculatePropValuesAsync方法只是同步:

private void CreateHistogram() 
{ 
    ... 
} 

private void CalculatePropValues() 
{ 
    ... 
} 

,並使用Task.Run並行執行它們:

private async void RecalcChartsAsync() 
{ 
    var histogram = Task.Run((Action) CreateHistogram); 
    var propValues = Task.Run((Action) CalculatePropValues); 

    //do some other stuff 

    await histogram; 
    await propValues; 
} 
+0

你的代碼不會以這種方式工作..我必須調用'Task.Run((=) > CreateHistogram());'或創建一個動作/委託。 thx無論如何,你的答案仍然很好:) – JuHwon 2013-02-28 15:07:30

+1

@Hown_:嗯......超載和方法組轉換是一個討厭的組合。一個簡單的演員應該雖然工作 - 編輯... – 2013-02-28 15:17:41

+0

鑄造'無效'類型到'行動'不會工作;) – JuHwon 2013-03-01 10:58:31

1

如果你不等待任何東西你兩個最後的方法,然後從聲明中刪除異步。在這種情況下,創建和返回任務就足以實現你想要的。