2013-09-26 130 views
1

我有不同的異步方法及其completed_eventhandlers Web服務。只要webservice方法完成,它就會執行它的事件處理程序。現在,在我的服務層中,我有一個通用方法,它將使用Func委託調用這些異步web服務方法。請注意,所有webservice方法都具有相同類型的簽名。使用TaskFactory.FromAsync調用SOAP Web服務

請指導我如何使用任務,讓自己的服務層方法也是異步,爲了調用這些異步方法,並提供從事件處理程序到用戶接收到的響應。

框架是.NET 4.0

請用一個例子引導

+1

使用begin ..方法,這些都是asnych allready。快速谷歌將產生大量的例子。 – CSharpie

+0

這應該是一個起點:http://msdn.microsoft.com/en-us/library/dd997423.aspx。你可以通過顯示一些代碼來澄清你的問題,你的服務層是怎樣的?你想怎麼稱呼它? – Rudi

+0

如果你願意,你可以用'開始...'方法一起使用'Task.Factory.FromAsync'。 – Shaamaan

回答

2

在.NET 4.5你可以創建一個返回異步調用,而不是APM式的方法(BeginX/EndX)

任務的代理

在.NET 4中,你可以在APM方法轉換爲使用Task.Factory.FromAsync任務。假設你的服務方法接收一個參數:

public MyResponse MyCall(MyRequest request); 

您可以使用這樣的代碼到APM式調用轉換(開始/結束)到一個任務:

var myRequestObject =...; 

var callTask=Task<MyResponse>.Factory.FromAsync(
     client.BeginMyCall, 
     client.EndMyCall, 
     myRequestObject, 
     null); // The state object, typically not used 

要使用更多的參數工作,使用其中一個接受更多參數的重載(最多3個)

多個FromAsync重載可能非常混亂,編譯器可能會抱怨很多無法找到通用參數的類型。

關鍵是要明白,第一個參數只需IAsyncResult對象,而第二個參數要求將處理最終結果的功能。即使是接受Func鍵<>作爲第一個參數,immediatelly運行它,並保持與IAsyncResult的

以上調用工作過載是相同的:

var ar=client.BeginMyCall(myRequestObject,null,null); 
var callTask=Task<MyResponse>.Factory.FromAsync(ar,client.EndMyCall); 
+0

感謝帕納約蒂斯。但是,FromAsync只能用於異步編程模型(APM),而不能用於基於事件的異步模式(EAP),是否正確? –

+0

您*詢問了一個Web服務,這意味着您必須使用APM風格。如果您想轉換EAP樣式調用,則需要使用TaskCompletionSource。檢查@Rudi提供的鏈接。在http://msdn.microsoft.com/en-us/library/ee622454.aspx上還有一個EAP示例 –