2012-09-22 100 views
7

我有這行代碼:爲什麼使用ContinueWith時會出現編譯器警告?

t.ContinueWith(_ => form.Close(), 
        TaskScheduler.FromCurrentSynchronizationContext()); 

...哪個編譯器有這樣一段話:

警告2由於這個呼叫沒有等待,目前的方法執行之前繼續通話完成。考慮將「await」運算符應用於調用的結果。

現在,這不是我寫的代碼,但我認爲它只是在現有任務的末尾添加延續。我沒有想到它實際上是運行的任務(或延續)。所以這個只修改任務的過程肯定是同步操作?我爲什麼要去await呢?

+0

Can I Haz Suround Coud? –

+0

你可以發佈整個方法嗎? –

+1

斯蒂芬,這是你的代碼:-)見http://stackoverflow.com/a/12513296/98422 –

回答

8

爲什麼我要await呢?

你不需要await它,這就是爲什麼它是一個警告,而不是一個錯誤。但是,如果您使用的方法是async,並且您有一個返回等待對象的方法,則大多數時候您不應該忽略它。

在正常的同步代碼中,你不必做任何特殊的事情來等待你調用的方法完成,每個方法調用總是阻塞。但是對於異步方法,如果你想等到它們完成,你實際上需要await。另外,如果異步操作失敗並拋出一個異常,那麼直到你方法的結果(或者從其他方式得到結果的異常,如調用Wait()如果可等候的是Task),你將不會知道它。 。

因此,如果您在async方法中忽略了返回的適合值,那麼您的代碼中可能存在一個錯誤,這是警告嘗試避免的錯誤。

在你的情況,ContinueWith()返回Task,這可以await版,所以編譯器假定您應該await它。但在這種情況下,您不希望等到繼續完成並且最有可能不會拋出異常。因此,在這種情況下,警告是誤報,它實際上並不代表代碼中存在問題。

+0

很好的答案,謝謝。有什麼我可以做的,以阻止警告出現,從而模糊所有的_actual_問題? (我不想在其他情況下禁用警告,只是在這裏)。 –

+3

如果您在方法之前添加'#pragma警告禁用4014'並且之後添加'#pragma warning restore 4014',您可以僅爲此方法禁用它。通常情況下,我會建議您解決警告所抱怨的內容,但在這種情況下,沒有什麼可修復的,因此禁用僅用於此方法的警告是有道理的,我認爲。 – svick

+1

另一種選擇是將任務分配給一個變量。然後簡單地忽略該變量。 – wasabi

相關問題