.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);