2012-07-12 124 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]