1

続行するためのボタンクリックイベントがあります:

 private void button3_Click(object sender, EventArgs e)
        {
            if (backgroundWorker1.IsBusy)
            {
                button2.Enabled = true;
                button3.Enabled = false;
            }
            else
            {
                backgroundWorker1.RunWorkerAsync();
                button2.Enabled = true;
                button3.Enabled = false;
            }

        }

一時停止のボタン クリック イベント:

private void button2_Click(object sender, EventArgs e)
        {
            if (backgroundWorker1.WorkerSupportsCancellation == true)
            {
                backgroundWorker1.CancelAsync();
                button3.Enabled = true;
                soundPlay = false;
                stop_alarm = true;
            }

        }

問題は、button3 クリック イベントで、バックグラウンドがビジー状態になることがあるため、ボタンの false/true を有効にできますが、backgroundworker は動作し続けます。DoWork イベントを一時停止して続行したい。

これは私の DoWork イベントです:

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            BackgroundWorker worker = sender as BackgroundWorker;
            while (true)
            {
                if ((worker.CancellationPending == true))
                {
                    e.Cancel = true;
                    break;
                }
                else
                {
                    if (tempCpuValue >= (float?)numericUpDown1.Value || tempGpuValue >= (float?)numericUpDown1.Value)
                    {
                        soundPlay = true;
                        blinking_label();
                    }
                    else
                    {
                        soundPlay = false;
                    }
                    cpuView();
                    gpuView();
                    Thread.Sleep(1000);
                }
            }
        }
4

2 に答える 2

2

Threadの代わりにBackgroundWorker?を使用してこれを行うことができます。

スレッドを使用すると、その作業サブルーチンで、をキャッチする try/catch ブロック内でスレッドを無限スリープ状態にすることができますThreadInterruptedException。そのため、処理中のものは何でもループするため、ブール値フラグの値を調べて、スリープするかどうかを確認してから、 を呼び出すことができますThread.Sleep(Timeout.Infinite)。キャッチThreadInterruptedExceptionすると、フラグを false に設定して実行を続けます。

UI からスレッドを再開するには、「一時停止」フラグを false に設定workerThread.Interrupt()し、スレッドを呼び出します (これを workerThread と呼んだと仮定します)。

アイデアはこちらから

于 2012-08-07T04:55:10.100 に答える
0

ボタンを有効/無効にする前に、キャンセルが完了するまで待つ必要がある場合があります。

private AutoResetEvent _resetEvent = new AutoResetEvent(false);

private void button2_Click(object sender, EventArgs e)
        {
            if (backgroundWorker1.WorkerSupportsCancellation == true)
            {
                backgroundWorker1.CancelAsync();
                //Wait statement goes here.
                this.Cursor=Cursors.AppStarting;
                _resetEvent.WaitOne(); // will block until _resetEvent.Set() call made

                button3.Enabled = true;
                soundPlay = false;
                stop_alarm = true;
            }

        }

この質問を見てください:

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            BackgroundWorker worker = sender as BackgroundWorker;
            while (true)
            {
                if ((worker.CancellationPending == true))
                {
                    e.Cancel = true;

                    break;
                }
                else
                {
                    if (tempCpuValue >= (float?)numericUpDown1.Value || tempGpuValue >= (float?)numericUpDown1.Value)
                    {
                        soundPlay = true;
                        blinking_label();
                    }
                    else
                    {
                        soundPlay = false;
                    }
                    cpuView();
                    gpuView();
                    Thread.Sleep(1000);
                }
            }

              _resetEvent.Set(); // signal that worker is done
        }
于 2012-08-07T05:25:25.737 に答える