2016-05-16 122 views
1

我有很多異步方法在我的服務器代碼,但我懷疑我有呼叫者沒有等待。找到失蹤的解決方案

有沒有簡單的方法來掃描等待丟失的呼叫代碼?

public async Task DomeSomethingAsync() 
{ 
    var result = await GetResult(); 
    await StoreResult(result); 
} 

然後在某個地方我忘了用await;

public async Task SomeBuggyCode() 
{ 
    await Initialize(); 
    DoSomethingAsync(); // DOH - Forgot await 
} 

我希望有一個聰明的方法來識別這些錯誤的呼叫。

+0

@Frode:是Roslyn需要具體嗎?或者找到它們的任何合理方式都行嗎?如果你不需要Roslyn,請從問題中刪除,這將明確表示像Charles這樣的答案是好的 – quetzalcoatl

+0

好的。當長時間使用resharper時,你開始搞砸了它做了什麼,什麼不是:) – Evk

回答

6

這應顯示爲與文本編譯器警告CS4014:

因爲這個電話是不是等待,結束通話之前,在當前方法的繼續執行。考慮將「await」運算符應用於調用的結果。

the documentation

所以你應該需要做的是編譯代碼。 VS應該允許您從其錯誤列表導航到相關位置。

+1

這顯然是最好的方法。我沒有得到這個警告的原因是因爲我有返回任務但不是異步的函數。由於某種原因,我剛剛返回了Task.CompletedTask。現在讓他們異步。 – Frode

1

如果該方法不包含一個等待,您可以檢查輸出窗口。編譯後,你會發現This async method lacks 'await' operators and will run synchronously ...警告。雙擊該警告將帶您到相關的方法。

2

找到它們的最簡單方法就是編譯代碼。

任何具有異步但沒有等待的函數都會導致compiler warning CS4014,一旦編譯完項目,看看警告列表,您將看到需要修復的所有函數。

1

如果你的應用程序沒有等待這些功能,你可能不想等待它們,只需將結果任務分配給一個變量來關閉警告。

顯然這取決於你自己決定。