2017-04-11 9 views
0

私は、ボタンが緑色に変わったときにユーザーがクリックした速度に基づいて、ユーザーの反応時間を確認するプログラムを用意しています。私はバックグラウンドで実行するボタンをクリックした後に動作している機能が欲しいです。バックグラウンドでボタン実行操作を行う方法

私はタスクを使用すると非同期になりますが、そうでないようです。私は待っていると理解し、おそらく私はそれが何とかそれが呼び出された場所に戻るようにする必要がありますが、私は解決策を見つけるのに問題があります。

私のコードは、これまでのところ、私はあなたが求めていたものより密接に反映するためにポストを編集したコメントに基づいて、この

public partial class Reaction : Form 
{ 
    Stopwatch timer; 
    bool start = false; 
    public Reaction() 
    { 
     InitializeComponent(); 
     button1.Text = "START"; 
     button1.BackColor = Color.Red; 

    } 

    public async Task Test() 
    { 
     if (start) 
     { 
      timer.Stop(); 
      TimeSpan timespan = timer.Elapsed; 
      string timeString = String.Format("{0:00}:{1:00}:{2:00}", timespan.Minutes, timespan.Seconds, timespan.Milliseconds/10); 
      MessageBox.Show(timeString); 
      button1.BackColor = Color.Red; 
      button1.Text = "START"; 
      start = false; 
     } 
     else 
     { 
      Random rnd = new Random(); 
      int number = rnd.Next(1, 10000); 
      System.Threading.Thread.Sleep(3000 + number); 
      timer = Stopwatch.StartNew(); 
      button1.BackColor = Color.Green; 
      button1.Text = "CLICK"; 
      start = true; 
     } 
    } 

    private async void button1_Click(object sender, EventArgs e) 
    { 

     button1.BackColor = Color.Red; 
     button1.Text = "Dont click"; 
     await Test(); 
    } 
} 
+0

なぜ スレッドT =新しいスレッド(テスト); T.start(); – Taco2

+1

スレッドの代わりにTask.Delay(1000)を使用する必要があります。 .Sleep –

+0

Usin g Task.Delay(1000);問題を解決しません。 「待つ」もう一つの待ちです – Taco2

答えて

0

のように見えます。非同期を削除し、ボタンのクリックイベントを待って、System.Threading.Thread.Sleep(...を待ってTask.Delayを置き換えます(...これは、BeginInvokeをbutton1で使用する必要はなく、別のスレッドは、UIが...(Task.Delay中に応答しなくなると、遅延が終了したとき、それは中断したところから再開します

Task.Delay(...となります。

public partial class Reaction : Form 
{ 
    Stopwatch timer; 
    bool start = false; 
    public Reaction() 
    { 
     ... 
    } 

    public async Task Test() 
    { 
     if (start) 
     { 
      ... 
     } 
     else 
     { 
      Random rnd = new Random(); 
      int number = rnd.Next(1, 10000); 

      // Replace Thread.Sleep with Task.Delay 
      await Task.Delay(3000 + number); 

      timer = Stopwatch.StartNew(); 
      button1.BackColor = Color.Green; 
      button1.Text = "CLICK"; 
      start = true; 
     } 
    } 

    // Make button1_Click not async and remove await 
    private void button1_Click(object sender, EventArgs e) 
    { 
     button1.BackColor = Color.Red; 
     button1.Text = "Dont click"; 
     Test(); 
    } 
} 
+0

button1.Text = "CLICK"でボタンテキストを変更しています。私は別のスレッドエラー – feni000

+1

@ feni000からアクセスします:はい、そうです。上記の答えはあなたの元のコードを取り、それをまったく新しい問題で包み込むためです。ここで 'Task.Run()'は必要ありません。元のメソッドでは 'await Task.Delay()'が必要です。あるいは、そのコードを 'button1_Click()'メソッドに入れるだけです。 –

+0

これはうまくいくかもしれませんが、 'async/await'は@PeterDunihoのように' Task.Run'を必要とせずにより洗練された解決策を提供します。 –

関連する問題