【问题标题】:Convert Event based pattern to async CTP pattern将基于事件的模式转换为异步 CTP 模式
【发布时间】:2012-10-12 06:28:25
【问题描述】:
  _fbClient.GetCompleted += new EventHandler<FacebookApiEventArgs>(OnFetchPageNotification);
  _fbClient.GetAsync(_kNotificationPath, new Dictionary<string, object> { { "access_token", _kPageAccessToken } });

如何将上述代码转换为 wp7 中的等待代码:

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

我也安装了 CTP 和任务并行库。

【问题讨论】:

    标签: c# windows-phone-7 async-await


    【解决方案1】:

    异步 ​​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)”)

    【讨论】:

    • 我想知道如果使用这种模式,您是否需要取消订阅 DownloadStringCompleted 事件以避免内存泄漏,或者 lambda 是否只是堆上的一个松散对象。
    • @FilipSkakun - 刚刚注意到您的评论,因此对延迟回复表示歉意。您会注意到该事件位于 wc 对象上,该对象本身看起来可能很快就会被垃圾回收。无论DownloadStringAsync 内部发生了什么,都可能使wc 对象足够活跃,以至于事件处理程序甚至被调用。但是一旦完成,wc 肯定有资格进行垃圾回收,因此,应该是添加到事件中的委托。
    • 只是好奇,为什么它必须是静态方法?我们可以把它写成私有方法吗?
    • @frostshoxx - 它不是“必须”成为静态方法。但是鉴于上面的代码是自包含的,并且显然不依赖于它所包含的任何类的任何实例状态,静态似乎是明智的。公共/私人是一个单独的选择,是的,如果适用的话,它很容易成为私人的。但是,我只是复制了一个现有的代码示例,它可能打算以“实用程序”样式的类作为辅助函数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-05
    • 1970-01-01
    相关资源
    最近更新 更多