我正在使用通用函數來執行wcf服務調用 - 請參閱下文。 我只是想確保我做正確的事:使用threading.Task來運行WCF方法
最重要的要求就是服務調用應該在單獨的線程執行。最初我想到Backgroundworker然後決定使用
Threading.Task
所以它很簡單,如
Task.Factory.StartNew(Function() functionToCall.Invoke(serv))
?
並得到結果result = t.Result
請告訴我之探源如果我這樣做:
昏暗T1作爲新建任務(的對象)(功能()functionToCall.Invoke(SERV))
t1.Start ()
結果= t1.Result我應該考慮
Parallel
?我錯過了什麼重要的東西嗎?
編輯:此功能是在客戶端解決方案的ServiceProxy項目
Private Function ServiceCall(ByVal functionToCall As ServiceDelegate(Of IEmpService)) As Object
Dim channel As New ChannelFactory(Of IEmpService)(_endPoint)
Dim serv As IEmpService
Dim result As Object = Nothing
serv = channel.CreateChannel()
Try
Dim t As Task(Of Object) = Task.Factory.StartNew(Function() functionToCall.Invoke(serv))
result = t.Result
Catch exp As Exception
CustomLog.Detail(exp)
Finally
If channel.State = CommunicationState.Faulted Then
channel.Abort()
Else
channel.Close()
End If
End Try
Return result
End Function
您的代碼在'result = t.Result'處被阻止。所以我沒有理由使用Task而不是直接調用方法。 –
L.B是對的。當訪問Task的'Result'屬性時,當前線程等待'Task'完成。所以你開始「Task」並等待它完成一行。這不是如何使用'Task'類的。你只是將工作轉移到另一個線程,但阻止了第一個線程,所以你不會贏得任何東西。 – fero
謝謝。根據你和調用線程(UI)將被阻止,這是我想要的相反。那麼如何正確使用'Task'來做到這一點? – melspring