2012-05-22 274 views
4

這不會拋出編譯錯誤,但爲什麼呢?C#.NET 4.5異步委託

public async void DoSomething(object arg){ ... } 

Action<object> myAnonActionDelegate = DoSomething; 

不應該「DoSomething」有Func<object,Task>類型的簽名,而不是行動?其實「DoSomething」沒有可分配給Func<object,Task>委託。

問題是爲什麼?我對async關鍵字的瞭解嗎?

回答

6

不應該「DoSomething」有類型Func<object,Task>而不是Action的簽名嗎?

否 - 該方法不返回任何東西。看看聲明 - 這是void,而不是Taskasync部分僅僅是爲了編譯器的好處(以及人類閱讀它) - 它不是方法簽名的真正部分。異步方法必須返回voidTaskTask<T> - 但該方法的返回類型真的聲明正是它的人。編譯器不會神奇地將您的void變成Task

現在你可以完全相同的方法體,並聲明該方法爲:

public async Task DoSomething(object arg){ ... } 

此時您需要使用Func<object, Task> - 但是這是一個不同的方法聲明。

我會強烈建議你使用形式返回Task除非你使用異步方法來訂閱事件 - 你可能也允許呼叫者觀察你的方法的進步,失敗等

+0

無它應該返回一個IAsynchResult或者一個Task,我不知道哪個是哪個,但是它需要編譯成指示這個方法是異步方法的東西。 – Alwyn

+0

明白了!謝謝喬恩。我想我希望和認爲異步會自動包裝返回類型內的任務。 – Alwyn

+1

@Alwyn,'async'方法不能返回'IAsyncResult',它總是返回'void','Task'或'任務'。 – svick