【问题标题】:WP8 SDK import Service Reference with task-based operations not possible无法使用基于任务的操作的 WP8 SDK 导入服务参考
【发布时间】:2012-11-07 08:48:37
【问题描述】:

到目前为止,在 VS2012 中使用“生成基于任务的操作”导入服务引用似乎不起作用。它是灰色的。

针对 WPF 的新项目的测试运行良好 - 我可以选择基于任务的操作或异步操作。

有没有简单的方法将异步调用包装在任务中?

【问题讨论】:

    标签: web-services asynchronous visual-studio-2012 task-parallel-library windows-phone-8


    【解决方案1】:

    有没有简单的方法将异步调用包装在任务中?

    WebClient.DownloadStringCompleted 的示例

    public static class WebClientAsyncExtensions
    {
        public static Task<string> DownloadStringTask(this WebClient client, Uri address)
        {
            var tcs = new TaskCompletionSource<string>();
    
            DownloadStringCompletedEventHandler handler = null;
            handler = (sender, e) =>
                {
                    client.DownloadStringCompleted -= handler;
    
                    if (e.Error != null)
                    {
                        tcs.SetException(e.Error);
                    }
                    else
                    {
                        tcs.SetResult(e.Result);
                    }
                };
    
            client.DownloadStringCompleted += handler;
            client.DownloadStringAsync(address);
    
            return tcs.Task;
        }
    }
    

    用法:

    async void DownloadExample()
    {
        WebClient client = new WebClient();
        await client.DownloadStringTask(new Uri("http://http://stackoverflow.com/questions/13266079/"));
    }
    

    【讨论】:

    • 确实如此,但在 .Net 中,异步操作并不总是任务。 BeginOp() 和 EndOp() 通常用于异步操作。在生成的 WebService 类中,它是通过 void MyOp() 和 MyOpCompleted(事件处理程序)完成的。这就是 SilverLight 和 WP7.x 中的旧样式。我需要函数存根返回一个任务来使用异步等待模式。或者从生成的函数动态创建任务的东西,例如:Tast.Factory.CreateFrom(BeginOp, EndOp)。但此选项不再适用于 WP8 SDK。
    • 那么您的问题是如何将 Begin/End 实现为任务?我可以为此创建一个示例。
    • 更新了一个例子。 TaskCompletionSource&lt;T&gt; 是这里的关键。
    • TaskCompletionSource 似乎使这一切成为可能。但是,如果您有许多 Web 操作要覆盖,那么编写代码会非常麻烦。
    • 而且 VS2012 已经可以创建等待函数存根。它仅对 WP8 项目禁用。 WPF 项目可以在两种锻炼模式之间切换。
    猜你喜欢
    • 2014-03-19
    • 2013-05-10
    • 1970-01-01
    • 2013-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-23
    • 1970-01-01
    相关资源
    最近更新 更多