2016-04-27 23 views
-1

を凍結ループは、ここに私のコードですが:私はクリックするとVisual StudioのC#のフォームアプリケーション

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

namespace _8BB_2._0 
{ 
    public partial class Form1 : Form 
    { 
     public static class globalVars 
     { 
      public static bool spacerunning = false; 
     } 

     public Form1() 
     { 
      InitializeComponent(); 
      globalVars.spacerunning = false; 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      if (!globalVars.spacerunning) 
      { 
       globalVars.spacerunning = true; 
       while (globalVars.spacerunning) 
       { 
        Thread.Sleep(1000); 
        SendKeys.Send(" "); 
       } 
      } 
      else if (globalVars.spacerunning) 
      { 
       globalVars.spacerunning = false; 
      } 
     } 
    } 
} 

Button1のそれはそれが必要のような毎秒スペースを打つ開始しますが、私はアプリケーションがフリーズし、それを遮断するために、再度それをクリックしようとするのですそれは押すスペースを維持します。私は複数の方法を試しましたが、whileループの中にロックされているので、私は一度に2つのことをやり遂げることができません。

答えて

3

Thread.Sleep()を呼び出すと、UIスレッドがブロックされます。代わりにasync/awaitを使用してみてください。

private async void button1_Click(object sender, EventArgs e) 
{ 
    globalVars.spacerunning = !globalVars.spacerunning; 

    while (globalVars.spacerunning) 
    { 
     await Task.Delay(1000); 
     SendKeys.Send(" "); 
    } 
} 

UPDATE:

代わりTimerを使用することができます。

public class MainForm : Form 
{ 
    private Timer timer = new Timer() { Interval = 1000 }; 

    public MainForm() 
    { 
     /* other initializations */ 

     timer.Enabled = false; 
     timer.Tick += timer_Tick; 
    } 

    private void timer_Tick(object sender, EventArgs e) 
    { 
     SendKeys.Send(" "); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     globalVars.spacerunning = !globalVars.spacerunning; 
     timer.Enabled = globalVars.spacerunning; 
    } 
} 
+0

ありがとうございました! UIが動作するようになりましたが、私がボタンをクリックしたときに停止しているように見えるしませんか?ことは、非同期で、または私のコードでエラーますか? – Prince

+0

コードは問題ありませんが、選択されていればスペースを送信してボタンを押すことができます。 –

関連する問題