1

さまざまな非同期メソッドとそれらの completed_eventhandlers を持つ Web サービスがあります。webservice メソッドが完了するたびに、そのイベント ハンドラーが実行されます。さて、私のサービス レイヤーには、Func デリゲートを使用してこれらの非同期 Web サービス メソッドを呼び出す汎用メソッドがあります。すべての Web サービス メソッドが同じタイプの署名を持っていることに注意してください。

これらの非同期メソッドを呼び出して、イベント ハンドラーから受信した応答をユーザーに提供するために、私のサービス レイヤー メソッドも非同期になるように、Task の使用方法を教えてください。

フレームワークは .NET 4.0

例を示してください

4

1 に答える 1

3

.NET 4.5 では、APM スタイルのメソッド (BeginX/EndX) の代わりに、非同期呼び出しのタスクを返すプロキシを作成できます。

.NET 4 では、Task.Factory.FromAsync を使用して APM メソッドをタスクに変換できます。サービス メソッドが単一のパラメーターを受け取ると仮定します。

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 つ) を受け入れるオーバーロードの 1 つを使用します。

複数の FromAsync オーバーロードは非常に混乱を招く可能性があり、コンパイラはジェネリック パラメーターの型が見つからないという多くの不平を言う可能性があります。

秘訣は、最初の引数には IAsyncResult オブジェクトだけが必要であり、2 番目の引数には最終結果を処理する関数が必要であることを理解することです。Func<> を最初のパラメーターとして受け入れるオーバーロードでさえ、すぐに実行して IAsyncResult を操作し続けます。

上記の呼び出しは次と同等です。

var ar=client.BeginMyCall(myRequestObject,null,null);
var callTask=Task<MyResponse>.Factory.FromAsync(ar,client.EndMyCall);
于 2013-09-26T09:02:42.563 に答える