13

私はこの簡単な方法を持っています:

static int Work (string s) { return s.Length; }

私はそれを実行することができます:

Task<string> task = Task.Factory.StartNew<int> (() => Work ("lalala") );
...
int result = task.Result;

またはこれで:

Func<string, int> method = Work;
IAsyncResult myIasync= method.BeginInvoke ("lalala", null, null);
...
int result = method.EndInvoke (myIasync);
  • どちらもスレッドプールスレッドを使用します。
  • 両方とも実行が終了するのを待ちます(値を読み取るとき)
  • どちらも、呼び出し元に例外を再スローします。

それぞれをいつ使用する必要がありますか?

4

2 に答える 2

20

を使用する2番目の形式は、IAsyncResultかなり古く、はるかに強力ではありません。Task<T>.NET 4で導入され、現在非同期操作を表すための推奨される方法です。特に、非ブロッキング方式でタスク(または他の非同期操作)を待機できる「非同期関数」をサポートするC#5では、使用がはるかに簡単です。

Task呼び出す代わりに使用してもBeginInvoke、操作自体の実行方法はおそらくあまり変わりませんが(ただし、スケジューリングなどの点でより多くのオプションが提供されます)、「監視」したいコードの観点からは大きな違いがあります。操作、結果の使用、複数のタスクの待機、障害の処理など。

C#5(.NET 4.5、または.NET 4と非同期ターゲティングパックのいずれか)を使用できる場合は、非同期操作の管理に関して非常に簡単になります。それは前進の道です:)

于 2012-12-04T07:41:20.137 に答える
0

タスクはよりエレガントで、最近(.Net 4)に導入されたので、ニーズを満たす場合はそれを使用します。

于 2012-12-04T07:43:14.203 に答える