2012-07-12 128 views
0

我有一個Silverlight 5應用程序,它使用WCF服務。已生成的代理客戶端僅具有異步方法(默認情況下,從SL客戶端生成時)。使用TAP和wcf EAP生成代理

我想利用VS2012RC中的基於任務的異步模式(TAP)。

從生成的客戶端代理中使用異步方法的最佳方法是什麼?

(問題是,該WCF代理生成器創建一個基於基於事件的異步模式(EAP),而不是點擊代碼....)根據此文檔

回答

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(); 
} 
0

我不知道這是否是在RC可用,但作爲SDK 8.0A的(包括一個使用VS2012)svcutil.exe將使用TAP模式生成異步方法。

默認情況下會使用TAP,因此請確保不包括包括/async,因爲這將使其回退到生成方法的舊APM方法。

您可以看看svcutil的版本是否足夠新,可以通過查看程序的第一行來使用TAP,它將包括它至少是該工具的4.0版本。

微軟(R)服務模型元數據工具[微軟(R)的Windows(R)
通信基礎版本4.0 .xxxxx.xxxxxx]