C# 将TAP与wcf EAP生成的代理一起使用

C# 将TAP与wcf EAP生成的代理一起使用,c#,silverlight,async-await,C#,Silverlight,Async Await,我有一个Silverlight 5应用程序,它使用WCF服务。已生成的代理客户端只有异步方法(默认情况下,从SL客户端生成时) 我想利用基于任务的异步模式(TAP),现在在VS2012RC中 从生成的客户端代理使用异步方法的最佳方法是什么 (问题是,WCF代理生成器创建的代码基于基于事件的异步模式(EAP),而不是点击…)基于此文档: 我已经找到了解决办法 见下面的代码: public class MyDataListProvider : IMyDataListProvider { p

我有一个Silverlight 5应用程序,它使用WCF服务。已生成的代理客户端只有异步方法(默认情况下,从SL客户端生成时)

我想利用基于任务的异步模式(TAP),现在在VS2012RC中

从生成的客户端代理使用异步方法的最佳方法是什么

(问题是,WCF代理生成器创建的代码基于基于事件的异步模式(EAP),而不是点击…)

基于此文档:

我已经找到了解决办法

见下面的代码:

public class MyDataListProvider : IMyDataListProvider
{
    private <ObservableCollection<IMyData>> myDataList;

    public Task<ObservableCollection<IMyData>> GetMyData()
            {
                TaskCompletionSource<ObservableCollection<IMyData>> taskCompletionSource = new TaskCompletionSource<ObservableCollection<IMyData>>();

                MyWCFClientProxy client = new MyWCFClientProxy();

                this.myDataList.Clear();

                client.GetMyDataCompleted += (o, e) =>
                {
                    if (e.Error != null)
                    {
                        taskCompletionSource.TrySetException(e.Error);
                    }
                    else
                    {
                        if (e.Cancelled)
                        {
                            taskCompletionSource.TrySetCanceled();
                        }
                        else
                        {
                            foreach (var s in e.Result)
                            {
                                var item = new MyData();
                                item.Name = s.Name;
                                item.Fullname = s.Fullname;

                                this.myDataList.Add(item);
                            }

                            taskCompletionSource.TrySetResult(this.myDataList);
                        }
                    }
                };

                client.GetMyDataAsync();

                return taskCompletionSource.Task;
            }
}

我不知道它是否在RC中可用,但是从SDK 8.0A(VS2012附带的版本)开始,
svcutil.exe
将使用TAP模式生成异步方法

默认情况下,它将使用TAP,因此确保包含
/async
,因为这将使它返回到生成方法的旧APM方法

您可以查看
svcutil
的版本是否足够新,是否可以使用TAP,方法是查看它将包含的程序的第一行,至少是该工具的4.0版本

Microsoft(R)服务模型元数据工具[Microsoft(R)Windows(R)
通信基础,版本<强> 4 < /强> XXXX.XXXXXX]

private async void SetMyDataList()
        {
            this.MyDataList = await this.myDataListProvider.GetMyData();
}