2012-10-12 22 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'肯定有资格进行垃圾收集,因此应该是添加到事件中的代表。 –