9

C#、VS2012、WPF 4.5 に次のコードがあります。私の期待は.ContinueWith、タスクが完全に終了した後に実行されることです (それは継続の全体的な目的ですよね?)。

これにより、 の値が 2 になるはずfinalResultです。

int myTestInt = 0;

Task task = Task.Factory.StartNew(async () =>
{
   myTestInt = 1;
   await Task.Delay(TimeSpan.FromSeconds(6));
   myTestInt = 2;

}).ContinueWith(_ =>
   {
      int finalResult = myTestInt;
   });

実際にfinalResultは、代わりに値 1 が割り当てられます。awaitそのため、ステートメントの継続はすでに開始されているようです。

これは意図した動作ですか?ここで何か不足していますか?ContinueWithタスクが完全に終了した後に開始することに頼ることはできませんか?

アップデート:

ジャスティンの答えは、次のことを確認するよう促しました。

int myTestInt = 0;
Task task=Task.Factory.StartNew(async () =>
{
   myTestInt = 1;
   await Task.Delay(TimeSpan.FromSeconds(6));
   myTestInt = 2;
});

task.Wait();
int result2 = myTestInt;

awaitfinalResult はまだ 1 に設定されています。s を含むタスクが完了するのを確実に待つ方法はありませんか?

4

3 に答える 3

10

asyncデリゲートをに渡すTask.Factory.StartNewと、返さTaskれる はそのデリゲートの最初の部分のみを表します (awaitまだ完了していないものになるまで)。

ただし、async新しいTask.Runメソッド (この理由で含まれていた) にデリゲートを渡すと、返さTaskれる はデリゲート全体を表します。ContinueWithそのため、期待どおりに使用できます。(ただしawait、通常は よりも優れたオプションですContinueWith)。

StartNewvsの詳細については、このトピックに関する Stephen Toub の投稿をRun参照してください。

于 2012-11-08T15:28:43.887 に答える
4

await はすぐに呼び出し元の関数 (この場合はタスクの StartNew) に制御を返します。これは、タスクが完了して ContinueWith を実行することを意味します。ContinueWith の前にタスクを完了させたい場合は、Task.Delay を待たないでください。

于 2012-11-08T09:04:54.977 に答える