2012-11-08 19 views
9

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

この結果、finalResultに2の値が設定されます。

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; 

finalResultがまだ1に設定されているが確実に完了するために、await Sを含むタスクを待つ方法はありません?

+4

あなたは 'await'キーワードを使わずに' Task.Delay'を直接呼び出すべきだと思います。 –

+2

'_'は実際にはJustinが何を言っているかを完全にサポートする' Task 'です... –

+0

実際には、Task.Delay(6)を使用すると期待される結果が得られますが、6秒待たないでしょう。私はライン全体を削除するのとほぼ同じだろうと思う。 –

答えて

10

あなたはTask.Factory.StartNewasyncデリゲートを渡すと、返さTaskのみ(アップ既に完了していない時、それはawait何かまで)そのデリゲートの最初の部分を表しています。

ただし、新しいTask.Runメソッド(これに含まれていた)にasyncデリゲートを渡すと、返されたTaskはデリゲート全体を表します。したがって、ContinueWithを期待どおりに使用することができます。 (通常awaitContinueWithより良い選択肢ですが)。

StartNewRunの詳細については、Stephen Toub's post on the topicを参照してください。

+0

リンク先は非常に明確です。ありがとうございました!! –

4

awaitは、直ちにコントロールを呼び出し関数(この場合はタスクのStartNew)に戻します。これは、タスクが完了し、ContinueWithを実行することを意味します。 ContinueWithの前にタスクを完了したい場合は、Task.Delayを待ってはいけません。

+0

私はあなたが正しいと思います - 現在の仕事を完了したものとしてマークします。それは(少なくとも意味的な観点からではないが)ではないが。待つのは今日のすべてのソフトウェアの基本的なビルディングブロックなので、もうContinueWithに頼ることは決してありません。それはバグだと思いませんか? –

-1

私はMSDNでこれを見た:

public async void button1_Click(object sender, EventArgs e) 
{ 
    pictureBox1.Image = await Task.Run(async() => 
    { 
     using(Bitmap bmp1 = await DownloadFirstImageAsync()) 
     using(Bitmap bmp2 = await DownloadSecondImageAsync()) 
     return Mashup(bmp1, bmp2); 
    }); 
} 

:-)だから、"非同期()" を忘れてはいけません!

+0

彼のコードには 'async'という彼の問題があります。彼は' TaskFactory'を使用しています。 'Task.Run'には' Func 'や' Func 'が入っています。 –

関連する問題