3

ボタンをクリックすると、次のようにいくつかのコードを記述したC#でWindowsアプリケーションを作成しています

public void btnStart_Click(object sender, EventArgs e)
        {
              while(true)
               {
                    //some processing
               }
        }

アプリケーションを起動すると、継続的に実行されます。しかし、他のボタンでは、そのアプリケーションを停止したいです。しかし、私はそれを行う方法を取得していません?私を助けてください.

4

6 に答える 6

1

C# のタイマーのユーザーを作成できます。ここでは、タイマーを使用したスト​​ップウォッチの一例を示します。 C# / Windows フォームを使用したシンプルなストップウォッチ/タイマー アプリケーションの作成

ここに一例があります: 完全な回答とコードを確認してください: C# start /Stop Button

BackGroundWorker を使用した例 (AmaL のコード スニペットの少し変更されたバージョン):

BackgroundWorker bgw;
Stopwatch watch;

public Form1()
{
  InitializeComponent();
  label1.Text = "";
  watch = new Stopwatch();
  bgw = new BackgroundWorker();
  bgw.DoWork += new DoWorkEventHandler(bgw_DoWork);
  bgw.ProgressChanged += new ProgressChangedEventHandler(bgw_ProgressChanged);
  bgw.WorkerReportsProgress = true;
  bgw.WorkerSupportsCancellation = true;
}

private void bgw_DoWork(object sender, DoWorkEventArgs e)
{
  while (true)
  {
    bgw.ReportProgress(0);
    System.Threading.Thread.Sleep(100);

    if (!watch.IsRunning)
      break;
  }
}

private void bgw_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
  TimeSpan ts = watch.Elapsed;
  label1.Text = String.Format("{0:00}:{1:00}:{2:00}", ts.Minutes, ts.Seconds, ts.Milliseconds);
}

private void button1_Click(object sender, EventArgs e)
{
  watch.Start();
  bgw.RunWorkerAsync();
}

private void button2_Click(object sender, EventArgs e)
{
  watch.Stop();
  watch.Reset();
  bgw.CancelAsync();      
}
于 2011-11-07T07:15:32.217 に答える
1

Background Workerスレッド化が非常に簡単であることを見てください:)

于 2011-11-07T07:15:57.933 に答える
0

レスポンシブ UI を作成する場合while (true) {...}は、メイン スレッドがビジー状態になるため、次のようなコードを記述しないでください。ここでは、本当にBackgroundWorkerを使用する必要があります。RunWorkerAsync()を介してワーカー スレッドを開始する前に、そのWorkerSupportsCancellationプロパティを設定することを忘れないでください。素敵なハウツーがあります。

于 2011-11-07T07:24:50.013 に答える
0

UI スレッド以外の別のスレッドで重い作業を行う必要があります。

于 2011-11-07T07:14:55.267 に答える
0

ここを見てください:http://www.c-sharpcorner.com/uploadfile/mgold/multithreadingintro10062005000439am/multithreadingintro.aspx

于 2011-11-07T07:15:52.167 に答える
0

while(true) を実行すると、メインスレッドがブロックされます。

代わりに、重い作業を別のスレッドで実行してください。

ここでスレッド化のチュートリアルを見つけることができます: http://msdn.microsoft.com/en-us/library/aa645740(v=vs.71).aspx

于 2011-11-07T07:35:56.157 に答える