2016-04-22 13 views
14

2つ(またはそれ以上)の非同期および従属(最初は2番目の実行を完了するために必要な)操作で構成される非同期コードを作成するには、あなたはおそらくできればawaitを使用したいと思います順番待ちVS継続要求待ち

await RunFirstOperationAsync() 
    .ContinueWith(t => RunSecondOperationAsync()); 
+2

[this](http://stackoverflow.com/questions/8767218/is-async-await-keyword-equivalent-to-a-continuewith-lambda)を参照してください。 –

答えて

15

:継続と

await RunFirstOperationAsync(); 
await RunSecondOperationAsync(); 

例:非同期/待つと

例。

ContinueWithには多くの問題があります。私はwhy ContinueWith is dangerousのブログ記事でこれを簡単に説明しています。これは以前のブログ記事why StartNew is dangerous(同じ問題の多くを共有しています)に基づいています。特に

  • ContinueWithが良いデフォルトTaskSchedulerを持っていません。既定のタスクスケジューラはTaskScheduler.CurrentTaskScheduler.Defaultではない)です。現在のSynchronizationContextでの再開は、必要に応じて手動で行う必要があります。
  • ContinueWithには、理想的でないデフォルトのoptionsがあります。非同期コードの場合は、少なくともDenyChildAttachExecuteSynchronouslyが必要です。
  • ContinueWithは、この制限を回避するために一般に追加のUnwrapコールが必要な非同期継続を認識しません。
  • ContinueWithは、その驚くべき方法でそのCancellationToken引数を扱います。その詳細in this blog post私の。

これらの引数は、すべて私のblog post on Task continuationsに要約されています。 awaitには、これらの欠点はありません。