2012-10-12 24 views
4
_fbClient.GetCompleted += new EventHandler<FacebookApiEventArgs>(OnFetchPageNotification); 
    _fbClient.GetAsync(_kNotificationPath, new Dictionary<string, object> { { "access_token", _kPageAccessToken } }); 

如何轉換上面的代碼爲awaitable代碼在WP7:轉換事件模式,以異步CTP模式

object = await _fbClient.GetAsync(_kNotificationPath, new Dictionary<string, object> { { "access_token", _kPageAccessToken } }); 

我已經安裝了CTP和任務並行庫還。

回答

15

Async CTP附帶一份文檔,介紹如何使每個現有模式適應基於任務的異步模式。它說,基於事件之一是更多變,但的確給了一個例子:

public static Task<string> DownloadStringAsync(Uri url) 
{ 
    var tcs = new TaskCompletionSource<string>(); 
    var wc = new WebClient(); 
    wc.DownloadStringCompleted += (s,e) => 
    { 
     if (e.Error != null) tcs.TrySetException(e.Error); 
     else if (e.Cancelled) tcs.TrySetCanceled(); 
     else tcs.TrySetResult(e.Result); 
    }; 
    wc.DownloadStringAsync(url); 
    return tcs.Task; 
} 

如果多數民衆贊成被包裝的原始功能是DownloadStringAsync,參數匹配被傳遞給這個函數的參數,DownloadStringCompleted是事件正在監測。


(同樣的文件似乎是可下載here - 上述樣品(和更多的描述)是由「任務和基於事件的異步模式(EAP)」)

+1

的4.5頁爲它是@ http://msdn.microsoft.com/en-us/library/ee622454.aspx –

+0

我想知道如果使用這種模式,您需要退訂'DownloadStringCompleted'事件以避免內存泄漏,或者如果lambda只是一個堆上的鬆散物體。 –

+0

@FilipSkakun - 只是剛剛注意到你的評論,所以對延遲的迴應表示歉意。你會注意到這個事件在'wc'對象上,它看起來很快就可能被垃圾回收。無論發生在'DownloadStringAsync'裏面的事情是否可以保持'wc'對象的活性,以至於事件處理器甚至被稱爲*。但一旦完成,'wc'肯定有資格進行垃圾收集,因此應該是添加到事件中的代表。 –