【问题标题】:Use TAP with wcf EAP generated proxies将 TAP 与 wcf EAP 生成的代理一起使用
【发布时间】:2012-07-12 06:56:06
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: c# silverlight async-await


    【解决方案1】:

    根据本文档: http://www.microsoft.com/en-us/download/details.aspx?id=19957

    我已经找到了解决方案。

    见下面的代码:

    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;
                }
    }
    

    客户 SL 代码:

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

    【讨论】:

      【解决方案2】:

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

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

      您可以通过查看程序的第一行来了解svcutil 的版本是否足够新以使用TAP,它将包括它至少是该工具的4.0 版。

      Microsoft (R) 服务模型元数据工具 [Microsoft (R) Windows (R)
      通信基础,版本 4.0.xxxxx.xxxxxx]

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-08-21
        • 2019-12-15
        • 2010-12-20
        • 1970-01-01
        • 1970-01-01
        • 2013-01-10
        • 2018-11-02
        相关资源
        最近更新 更多