41

.NET 4.0およびVS2010でC#を使用する.NETプロジェクトがあります。

私がやりたいのは、ライブラリに非同期オーバーロードを追加して、.NET4.5のユーザーがawaitキーワードを使用して非同期プログラミングを簡単に行えるようにすることです。現在、オーバーロードされているメソッドは非同期です。また、自分で非同期メソッドを使用するのではなく、新しいメソッドを作成して使用できるようにするだけです。

.NET 4.0およびVS2010で非同期メソッドを作成することは可能ですか?その場合、.NET 4.0非同期メソッドはどのようになりますか?

VS2010を使用しているため、「async」キーワードにアクセスできません。.NET4.0でその動作をエミュレートするにはどうすればよいですか?たとえば、特定の型を返す必要がありますか?また、呼び出している現在非同期のコードを非同期で発生させるために、メソッド内でコードを発生させる必要がありますか?

4

3 に答える 3

32

他の人が述べているように、あなたはメソッドreturnTaskまたはを持っていることから始めますTask<TResult>。これはawait、.NET4.5での結果には十分です。

メソッドを将来の非同期コードにできるだけ適合させるには、タスクベースの非同期パターンドキュメントMSDNでも入手可能)のガイドラインに従ってください。キャンセルをサポートするためなど、命名規則とパラメータの推奨事項を提供します。

メソッドの実装には、いくつかの選択肢があります。

于 2012-03-06T00:01:41.850 に答える
9

Taskこれを行う最も簡単な方法は、またはを返すことTask<T>です。それで十分です。

ただし、これは、メソッドが実際に非同期で実行される場合にのみ意味があります。

また、AbcAsync( "Async"サフィックス)のような名前を付ける通常のパターンに従うことをお勧めします。呼び出し元は、C#5で作成された非同期メソッドとの違いに気付くことはありません(存在しないため)。

ヒント:メソッドに非同期を追加するだけでは何も起こりません。メソッドは順番に実行され、完了したタスクを返します。メソッドにタスクを返すようにするには、特定の目的を果たす必要があります。通常、これは、メソッドが本質的に非同期で実行されるために行われます(Webサービス呼び出しやファイルIOなど)。

メソッドに計算のみが含まれ、IOが含まれていない(またはブロックされているIOのみ)場合は、通常、非同期にしない方がよいでしょう。これを行うと何も得られないからです。非同期メソッドは、常に別のスレッドで実行されるとは限りません。その最後の文があなたを驚かせたなら、あなたはこのトピックを少し掘り下げたいと思うかもしれません。

于 2012-03-05T22:12:26.457 に答える
3

なんらかの方法で(スレッド内であろうと非同期であろうと)完了するタスクを返す限り、非同期モデルをサポートします。

タスクを非同期で実行することは別の話です。asyncキーワードとAPIにアクセスできる場合は、すでに提供されている他のasyncメソッドへの非同期呼び出しに基づいてメソッドを作成できます。ただし、この場合、非同期タスクを手作りする必要があります。

それを行うためのより良い方法があるかもしれませんが、私が見ることができる(そして使用した)最もエレガントな方法はSystem.Threading.Tasks.TaskCompletionSource、タスクを構築するために利用し、実行する必要があるものを実行するために非同期メソッドのBegin/モデルを使用することです。End次に、結果が手元にある場合はTask、完了ソースを使用して、以前に構築したインスタンスに結果を投稿します。

それは確かに非同期であり、次のリリースのものほど派手ではありません。

免責事項:私はこれに関する専門家にほど遠いです。でいくつかの実験を行いました。

于 2012-03-05T23:07:13.453 に答える