2017-04-11 98 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);而不是Thread 。睡眠 –

+0

Usin g Task.Delay(1000);并不能解决问题。这只是等待“等待” – Taco2

回答

0
基于我编辑的职位,以反映你问的更密切什么意见

。删除按钮的单击事件中的异步和等待,并替换System.Threading.Thread.Sleep(...与等待Task.Delay(...这样你就不必使用button1上的BeginInvoke,并且唯一的单独的线程将是Task.Delay(...

的UI将在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()'。您需要在原始方法中等待Task.Delay(),或者将所有代码放在'button1_Click()'方法中。 –

+0

尽管这可以起作用,但async/await提供了更优雅的解决方案,无需像@PeterDuniho提到的那样需要Task.Run。 –

相关问题