我有一個Silverlight 5應用程序,它使用WCF服務。已生成的代理客戶端僅具有異步方法(默認情況下,從SL客戶端生成時)。使用TAP和wcf EAP生成代理
我想利用VS2012RC中的基於任務的異步模式(TAP)。
從生成的客戶端代理中使用異步方法的最佳方法是什麼?
(問題是,該WCF代理生成器創建一個基於基於事件的異步模式(EAP),而不是點擊代碼....)根據此文檔
我有一個Silverlight 5應用程序,它使用WCF服務。已生成的代理客戶端僅具有異步方法(默認情況下,從SL客戶端生成時)。使用TAP和wcf EAP生成代理
我想利用VS2012RC中的基於任務的異步模式(TAP)。
從生成的客戶端代理中使用異步方法的最佳方法是什麼?
(問題是,該WCF代理生成器創建一個基於基於事件的異步模式(EAP),而不是點擊代碼....)根據此文檔
: 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();
}
我不知道這是否是在RC可用,但作爲SDK 8.0A的(包括一個使用VS2012)svcutil.exe
將使用TAP模式生成異步方法。
默認情況下會使用TAP,因此請確保不包括包括/async
,因爲這將使其回退到生成方法的舊APM方法。
您可以看看svcutil
的版本是否足夠新,可以通過查看程序的第一行來使用TAP,它將包括它至少是該工具的4.0版本。
微軟(R)服務模型元數據工具[微軟(R)的Windows(R)
通信基礎版本4.0 .xxxxx.xxxxxx]