我有一个使用WCF服务的Silverlight 5应用程序。已生成的代理客户端仅具有异步方法(默认情况下,从SL客户端生成时)。
我想在VS2012RC中使用基于任务的异步模式(TAP)。
从生成的客户端代理中使用异步方法的最佳方法是什么?
(问题是,WCF代理生成器创建的代码基于基于事件的异步模式(EAP)而不是TAP ....)
答案 0 :(得分: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();
}
答案 1 :(得分:0)
我不知道它是否在RC中可用,但是从SDK 8.0A(VS2012附带的那个)开始,svcutil.exe
将使用TAP模式生成异步方法。
默认情况下会使用TAP,因此请确保 NOT 包含/async
,因为这会使其回退到生成方法的旧APM方法。
您可以查看svcutil
的版本是否足够新,以便通过查看程序的第一行来使用TAP,它将包含至少4.0版本的工具。
Microsoft(R)服务模型元数据工具[Microsoft(R)Windows(R)
Communication Foundation,版本 4.0 .xxxxx.xxxxxx]