0

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

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

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

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

4

2 回答 2

2

基于此文档: 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();
}
于 2012-07-12T10:53:40.397 回答
0

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

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

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

Microsoft (R) 服务模型元数据工具 [Microsoft (R) Windows (R)
Communication Foundation,版本4.0 .xxxxx.xxxxxx]

于 2013-02-09T21:46:40.397 回答