2017-02-15 2 views
-1

誰かがこのコードがUIをブロックしない理由を私に説明できますか?私は新しいスレッド/タスクやアプリケーションを作成していないだけで正常に動作します。 5秒後に完了した1 -Task.Delay()がUIスレッドをリリースしますか?

private void button1_Click(object sender, EventArgs e) 
    { 
     Test1(); 
    } 

    private async void Test1() 
    { 
     var random = new Random(); 
     while (true) 
     { 
      try 
      { 
       textBox1.Text = random.Next(1, 100).ToString(); 
       textBox2.Text = random.Next(1, 100).ToString(); 
       await Task.Delay(5000); 
      } 
      catch (Exception) 
      { 
       break; 
       throw; 
      } 
     } 
    } 
+2

http://stackoverflow.com/questions/25115446/await-task-delay-helps-in-ui-refresh-faster-but-how – Habib

+0

私は毎日メールボックスをチェックしています。私はそれをチェックして、1日後にもう一度それをチェックする必要があります。私がそのような要件を持っていれば私のメールをチェックする以外に何かできることはありますか? X分/秒/日/などで何かをする必要があります。あなたと今の間に何もできないということを意味するわけではありません。 – Servy

+0

インターネット上の豊富な情報はもちろん、 'async'と' await'がどのように協調してコードが明らかに同期してブロックされた形で書き込まれるのかを説明しているStack Overflowに関する** Q&Aが多数ありますスレッドを実際にブロックすることなく。より一般的なものについては、重複したものを参照してください。 –

答えて

1

イムは一種の... Task.Delayないは、新しいタスクを作成し、任意の新しいスレッド/タスク

まあを作成していません。

あなたのコードは、そのタスクのawaitを呼び出します。は、Test1からを返します。 awaitの動作の詳細については、async introを参照してください。

これらの5秒間に、あなたのUIスレッドは自由に(ユーザーの入力に反応するような)他の仕事をすることができます。これらの5秒の最後に、Task.Delayから返されたタスクが完了し、UIスレッドはTest1の実行を再開します。

補足として、async voidを避ける必要があります。一般的には、イベントハンドラにはasync voidを使用してください。詳細については、私の記事async best practicesを参照してください。

関連する問題