2016-08-08 15 views
0

サービス関数を呼び出すためのWCF非同期begin endパターンがあります。私はタスクの中にラップされたbegin関数を持っています。タスクが待たれているとき、begin関数に渡されるコールバック関数が終了するのを待つことはありません。コールバック関数の実行が完了するのを待たせるにはどうすればよいですか?ありがとうございました。WCF非同期コールバック関数でタスクを待機させる方法は?

これは私が持っているものです。

Public Sub Process(pCase)   
    Dim client As CaseRecord.CaseRecordPort 
    client = New CaseRecord.CaseRecordPortClient 
    DirectCast(client, CaseRecord.CaseRecordPortClient).Open() 

    Dim clientTask As Task = Task.Factory.StartNew(Sub() 
    client.BeginCaseProcess(pCase, AddressOf CaseRequestCompleted, client) 
               End Sub) 

    clientTask.Wait() 

    If IsPaid() Then 

    End If 
End Sub 

Private Sub CaseRequestCompleted(ByVal result As IAsyncResult) 
    Dim client As CaseRecord.CaseRecordPortClient = DirectCast(result.AsyncState, CaseRecord.CaseRecordPortClient) 
    Dim tCaseResponse As CaseResponse = Nothing 
    Dim sError As String = "" 

    Try 
     tCaseResponse = client.EndCaseProcess(result) 
    Catch ex As TimeoutException 
     sError = "Timeout error" 
    Catch ex As Exception 
     sError = ex.Message 
    Finally 
     RaiseEvent CaseRequestCompleted(tCaseResponse, sError) 
    End Try 
End Sub 
+0

Visual Studio 2013+(私も2012も同様です)では、Begin/Endメソッドの代わりに* Tasks *を使用してプロキシを生成できます。おそらく最も簡単な解決策は、タスクベースのメソッドを生成するためにプロキシを再構築することです。 –

答えて

1

StartNewは危険なAPIであり、使用しないでください。あなたの場合は、とにかくそれを必要としません。

Begin*/End*を明示的に呼び出す代わりに、Task.Factory.FromAsyncを使用してラップすることができます。私のVBは錆びですが、C#のコードは次のようになります。TAP wrappers for APMを参照してください

CaseResponse tCaseResponse = await Task.Factory.FromAsync(client.BeginCaseProcess, 
    clientEndCaseProcess, pCase, null); 

+1

おそらく、より簡単な解決策は、WCFプロキシを再作成することでしょう。 VS 2013+(少なくとも)タスクベースのプロキシを生成する –

+0

@PanagiotisKanavos:優秀な点 - それを忘れてしまった! –

+0

現在、このプロジェクトは.net framework 4.0に設定されています。 .net framework 4.0でタスクベースの操作を生成するためにWCFプロキシを再作成することは可能ですか?ありがとうございました。 – Jyina

関連する問題