2014-01-06 40 views
1

這是關於在異步回調函數上使用異步包裝的another SO question的後續問題。使用TaskCompletionSource.TrySetResult()的錯誤

下面是代碼,因爲它代表(由@Servy提供了一個良好的解決方案):

static Task<ObservableCollection<MyResult>> GetMyDataAsync(Params p) 
{ 
    var tcs = new TaskCompletionSource<ObservableCollection<MyResult>>(); 
    DoStuffClass stuff = new DoStuffClass(); 
    stuff.LoadCompleted += (args) => tcs.TrySetResult(args.Result); 
    stuff.LongDrawOutProcessAsync(p); 
    return tcs.Task; 
} 

所以,我的問題是與LoadCompleted事件;這裏是簽名:

public event EventHandler<MyArgs> LoadCompleted; 

MyArgs包含一個名爲ResultCollection的屬性;然而,改變這樣的代碼不起作用:

stuff.LoadCompleted += (args) => tcs.TrySetResult(args.ResultCollection); 

事實上,我得到的錯誤:

'System.EventHandler<MyArgs>' does not take 1 arguments 

,我可以,如果正確看到簽名;那麼如何將LoadCompleted結果設置爲TaskCompletionSource

回答

3

EventHandler需要2個參數,第一個是引發事件的實例,第二個是事件參數。即使只使用一個(args),也需要指定它們。 這應該工作:

stuff.LoadCompleted += (sender, args) => tcs.TrySetResult(args.Result); 
+0

讓我過了幾秒 –

+0

@ AZ.next時間... – i3arnon

+0

但我想這並不能阻止別人.... – i3arnon

2
stuff.LoadCompleted += (sender, args) => tcs.TrySetResult(args.Result); 

如果你看看EventHandler<T>定義你會看到它有兩個參數

public delegate void EventHandler<TEventArgs>(object sender, TEventArgs e); 

所以,你需要傳遞兩個這應該可以解決您的問題

1

你的任務中的論點

stuff.LoadCompleted += (sender, args) => tcs.TrySetResult(args.Result);