2017-11-11 4 views
-1
switch (Pattern[i]) 
     { 
      case "Blue": 
       blueButton.BackColor = Color.LightBlue; 
       Thread.Sleep(1000); 
       blueButton.BackColor = Color.Red; 
       break; 
      case "Lime": 
       limeButton.BackColor = Color.Aquamarine; 
       Thread.Sleep(1000); 
       limeButton.BackColor = Color.Red; 
       break; 
      case "Yellow": 
       yellowButton.BackColor = ColorTranslator.FromHtml("#FFFF80"); 
       Task.Delay(1000).Wait(); 
       yellowButton.BackColor = Color.Red; 
       break; 
      case "Red": 
       redButton.BackColor = Color.Pink; 
       Task.Delay(1000); 
       redButton.BackColor = Color.Red; 
       break; 
     }  

しかし、遅延はありません。それだけでジャンプします。私はTask.DelayとThread.Sleepの両方を使ってみましたが、実際には遅れません。また、私は新しいプログラマーなので、簡単にそれを取ってください。C#WindowsフォームThread.Sleep()は動作しませんか?

+1

壊れた解決策だけでなく、実際の問題を解決する必要があります。 – zerkms

+0

あなたは値が赤、黄、石灰または青であると確信していますか? –

+0

ボタンが押されているように見せようとしています。また、それはケースに入る、私はチェックした。遅延をスキップして赤に切り替えるだけです。 –

答えて

2

Thread.Sleepは期待通りに実行を遅延していますが、何のアップデートが表示されていないため、UIを印刷しているのと同じスレッド上でこのコードを実行します。

このための簡単な修正は(あなたがasyncとしての機能をマークする必要があります)Task.Delayです:機能をマークする

case "Blue": 
    blueButton.BackColor = Color.LightBlue; 
    await Task.Delay(1000); 
    blueButton.BackColor = Color.Red; 
    break; 

は、非同期関数呼び出しにasyncキーワードを追加

private async Task showPattern(List<string> Pattern) 

ますWindowsのGUIスレッドとasync programmingについていくつかの基本を読みます。

UIの非常に基本的な説明スレッド: Form.Showまたはを呼び出すと、アプリケーションはいわゆるメッセージループを開始します。このメッセージループは、表示されたウィンドウのマウスイベントとキーボードイベントを処理します。このメッセージループは、ウィンドウの描画も処理します。したがって、このスレッドがロックされていると、アプリケーションは応答しなくなります。ボタンクリックハンドラ(およびあなたの他のすべてのハンドラ)は、この同じスレッドによって処理されます。 (Thread.Delayのように)このハンドラの1つで実行をブロックすると、ウィンドウは応答しません(イベントを処理せず、再描画しません)。

この問題を解決するには、asyncawaitを使用しますか? 。この2つの方法は、この作業を期待するように多くのコンパイラの魔法を使っています(詳細はリンクを確認してください!)

+0

再び申し訳ありませんが、それを非同期平均とする方法とそれを行う方法は何ですか? –

0

あなたと同じシナリオを再現するのは少し難しいですが、私はあなたの問題をテストするための小さな試みをしました。このように動作しています。私は、単純化のために、選択された値をコンボボックスから切り替えることによって、すべての操作を実行するために、ただ1つのボタンを使用しています。それは割り当てられた色に色を変え、1秒後に赤色に色を変えます。私はできるだけ早くgifを投稿しようとします。

enter image description here

あなたのコードは魅力のように働きました!私は、他のコントロールやスイッチング変数をチェックすることをお勧めします。

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Threading; 
using System.Threading.Tasks; 
using System.Windows.Forms; 

namespace WindowsFormsApp1 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 

     } 

     private void button1_Click(object sender, EventArgs e) 
     { 

      String color = this.comboBox1.SelectedItem.ToString(); 

      switch (color) 
      { 
       case "Blue": 
        button1.BackColor = Color.LightBlue; 
        Thread.Sleep(1000); 
        button1.BackColor = Color.Red; 
        break; 
       case "Lime": 
        button1.BackColor = Color.Aquamarine; 
        Thread.Sleep(1000); 
        button1.BackColor = Color.Red; 
        break; 
       case "Yellow": 
        button1.BackColor = ColorTranslator.FromHtml("#FFFF80"); 
        Task.Delay(1000).Wait(); 
        button1.BackColor = Color.Red; 
        break; 
       case "Red": 
        button1.BackColor = Color.Pink; 
        Task.Delay(1000); 
        button1.BackColor = Color.Red; 
        break; 
      } 
     } 
    } 
} 
+1

私はかなり赤いケースがうまくいかないと確信しています.. task.delayへの呼び出しが待たれて待たれていないので、それはそれを続けるでしょうか? – Dave

+0

こんにちはデイブ...私はちょうどテストした!はい...奇妙なことに、すべてのシナリオが黄色で動作していません。色を変えても – oetoni

関連する問題