0

一般的な関数を使用して wcf サービス呼び出しを実行しています - 以下を参照してください。私は正しいことをしていることを確認したいだけです:

  • 最も重要な要件は、サービス コールを別のスレッドで実行する必要があることです。最初はBackgroundworkerを考えてから使用することにしThreading.Taskたので、それは簡単
    Task.Factory.StartNew(Function() functionToCall.Invoke(serv))ですか?
    そして結果を得るresult = t.Result

  • 私が行う場合の違いは何ですか:

    Dim t1 As New Task(Of Object)(Function() 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
4

2 に答える 2

2

一般的に、はい、概説したパターンは、利用できるメカニズムが他にないときに呼び出しを非同期にしたい場合に一般的に受け入れられます。

ただし、WCF の場合、非同期デザイン パターンに準拠するコントラクトを生成できます。サービス参照を生成するときは、[詳細設定] ボタンをクリックし、[非同期操作の生成] を選択します。

サービス参照の詳細オプション ダイアログ

これを行うと、サービス コントラクトが生成され、同期操作の代わりにIAsyncResultインターフェイスの実装 ( Begin/ ) が返されます。End

これらは、IO が完了するのを待っているときにブロックされるスレッドを解放できるため、同期操作よりも優先されます (これはハードウェア信号であり、スレッドを保持する必要があるものではありません)。

そこから、クラスのFromAsyncメソッドを呼び出して、呼び出しを非同期に待機/続行するために使用できる (スレッドもブロックしません)を返すことができます。TaskFactoryTask<TResult>

于 2012-09-26T14:10:30.220 に答える
0

sync というメソッド内で非同期呼び出しを実行したいのですが、意味がありません。

このメソッドを同期させ (タスク関連のコードを削除)、代わりに Task/Backgroundworker を使用して ServiceCall メソッドを呼び出すことをお勧めします。

public メソッドで新しいオブジェクトを使用して、同期 ServiceCall メソッドへの非同期呼び出しをカプセル化し、イベントを受信するたびにデータを返すようにします。

そして、次のように使用します。

var caller = new Caller();
caller.Done += { // Your data handling here };
caller.Call(Method1);

ここで、このオブジェクトを少し操作して、返されるメソッド ロジックをコンストラクターで渡すか、別のパラメーターとしてラムダを Call メソッドに渡します。

イベントベースの非同期パターン (EAP)を実装する簡単な方法。

于 2012-09-26T14:08:43.200 に答える