2013-12-09 60 views
0

我想爲事件訂閱異步方法。使用委託的異步/等待

但是,編譯器不會讓我。

我該怎麼做?

例子:

class SearchBase 
{ 
    public delegate void ReuestingCollectionHandler(); 
    public event ReuestingCollectionHandler RequestingCollection = null; 
} 
. 
. 
. 
SearchBase.RequestingCollection += LoadCandidates; 


public async Task LoadCandidates() 
{ 
    var queryText = string.Empty; 
    Candidates = await CandidatesManager.GetCandidates(Profile.Instance.RecruiterId); 
} 
+0

Jusr寫這將是委託功能,這種方法中調用異步方法 – srsyogesh

回答

3

您的LoadCandidates方法是否僅用作事件處理程序(如您發佈的代碼所示)?

如果是這樣,您應該將其更改爲async void而不是返回Task。這是事件處理程序的常用簽名,並且可以接受/推薦使用async void方法的極少數情況之一。

如果你要使用它別的地方,需要它返回一個任務,然後寫一個async void包裝方法周圍,並用此包裝作爲事件處理程序來代替。

public async void LoadCandidatesAsync() 
{ 
    await LoadCandidates(); 
} 

事件處理函數應該任何回報。如果一個調用者有100個客戶端在監聽該事件,他只會得到其中一個處理程序的返回值。 如果調用者想從處理程序中獲得某些東西,那麼它應該給它們發送一個可變的EventArgs實例。

這裏是爲什麼事件處理程序應該返回void一個更完整的解釋:https://stackoverflow.com/a/3325425/857807

+2

請記住,這樣做意味着當您提出事件時,處理程序可能會並行執行,並且您不會在完成時找出它們。 – svick

1

您的代表需要匹配,則無法分配,返回一個任務返回類型爲void的委託方法。

+0

但我不能申請一個「異步任務」的包裝方法也可以代表簽名。那麼我有什麼選擇? –

+1

異步是語法糖,可幫助您構建返回任務的方法。您的委託應該是公共委託Task RequestingCollectionHandler()。請注意,您不會以標準方式使用活動,因此請確保您不會陷入麻煩。 – fsimonazzi

+0

我喜歡你不想將你的LoadCandidates方法改爲async void,這是你的選擇之一。在我看來,你應該嘗試使用Func 或者動作來做這樣的事情。 – Zache