2013-02-18 123 views
1

我正在連接到Windows Phone 7.1的SOAP服務。服務代理具有Get____Async方法和Get_____Completed事件。 我在我的客戶端中構建了一個服務類,該服務類將調用包裝爲SOAP服務。從客戶端公開WCF soap服務作爲異步任務<T>?

我可以以某種方式把它包起來,使得它的界面就變成了:

public NNNNService 
{ 
    public async Task<List<NNNNNN>> GetNNNNN(A a, B b, C c) 
    { 
     // ? 
    } 
} 
+0

您能說明方法和事件的確切樣子嗎?你有什麼嘗試? – svick 2013-02-18 10:14:16

+0

@svick方法和事件是Soap代理從「添加服務引用」生成的方法。我沒有嘗試過任何東西,因爲我不知道它是否可能。我見過的例子似乎使用Be​​gin/End方法進行換行。 http://msdn.microsoft.com/en-us/library/vstudio/hh873178.aspx – 2013-02-18 10:21:48

+1

該文章正是你所需要的。請特別參閱[任務和基於事件的異步模式(EAP)]部分(http://msdn.microsoft.com/zh-cn/library/vstudio/hh873178.aspx#EAP)。 – svick 2013-02-18 10:39:18

回答

2

您可以使用以下方式包裹EAP進入TAP:

public static class NNNNServiceExtensions 
{ 
    public static Task<ReturnType> MethodNameTaskAsync(this NNNNService service, A a) 
    { 
     if (service == null) 
      throw new NullReferenceException(); 


     var tcs = new TaskCompletionSource<ReturnType>(); 

     EventHandlerType handler = null; 
     handler = (s, o) => 
     { 
      service.MethodNameCompleted -= handler; 
      tcs.TrySetCompleted(o.Result); 
     }; 

     service.MethodNameCompleted += handler; 
     try 
     { 
      service.MethodNameAsync(); 
     } 
     catch 
     { 
      service.MethodNameCompleted -= handler; 
      throw; 
     } 

     return tcs.Task; 
    } 
} 

隨着取消可選支持,進度報告等等。有時很難指定返回類型。如果您的Completed事件使用EventArgs,則可以通過以下方式調整代碼:

public static Task MethodNameTaskAsync(this NNNNService service, A a) 
{ 
    var tcs = new TaskCompletionSource<bool>(); 
}