6

これが私のコードでのやり方です: backgroundWorker DoWork イベントで私がしたこと:

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            _busy.WaitOne();
                this.Invoke(new MethodInvoker(delegate { label2.Text = "Website To Crawl: "; }));
                this.Invoke(new MethodInvoker(delegate { label4.Text = mainUrl; }));
                webCrawler(mainUrl, levelsToCrawl, e);


        }

次に、一時停止ボタンのクリック イベントで、次のことを行いました。

private void button4_Click(object sender, EventArgs e)
        {
            _busy.Reset();
        }

再開ボタンのクリックイベントで私がした:

private void button5_Click(object sender, EventArgs e)
        {
            _busy.Set();
        }

しかし、クリックしてプロセスを開始しても機能しません。

private void button1_Click(object sender, EventArgs e)
        {
            backgroundWorker1.RunWorkerAsync();
            button1.Enabled = false;
            this.Text = "Processing...";
            label6.Text = "Processing...";
            label6.Visible = true;
            button2.Enabled = false;
            checkBox1.Enabled = false;
            checkBox2.Enabled = false;
            numericUpDown1.Enabled = false;
            button3.Enabled = true;
        }

再開ボタンをクリックしたときにのみプロセスが開始され、一時停止ボタンをクリックしても何も起こりません。

プロセスの開始ボタンをクリックすると、通常の backgroundWorker が開始され、一時停止ボタンをクリックすると一時停止し、再開ボタンをクリックすると再開されるようにします。

私は何を間違えましたか?誰かが私のコードを修正できますか?

4

5 に答える 5

11

BackgroundWorker スレッド コードで、安全に実行を "一時停止" できる場所を見つける必要があります。ManualResetEvent は正しいコーディング方法です。この他の投稿が役立つかもしれません: スレッドを無期限に一時停止する方法はありますか?

基本的に、一時停止を許可するワーカー スレッド コードのいくつかの選択ポイントで、次を挿入してみてください。

_busy.WaitOne(Timeout.Infinite);

そして、(メインスレッドから)一時停止したいときは、次を使用します:

_busy.Reset();

そして再開するには:

_busy.Set();
于 2012-10-08T11:15:32.473 に答える
0

私はこのスレッドの答えを探していましたが、私が作成した独自の解決策を思いついたので、それをあなたと共有したいと思います. これがうまくいくことを願っています。

バックグラウンド ワーカーがあり、フォームの閉じるボタンを押したときに一時停止したいと考えています。「プロセスをキャンセルしようとしています」と尋ねるので、プロセスを一時停止する必要があります。

クラスで宣言bool pauseWorker = false;します。

private void bgWorker_DoWork(object sender, DoWorkEventArgs e)
{
   while (condition)
   {
      if (pauseWorker == true)
      {
         while (pauseWorker == true)
         {
            if (pauseWorker == false) break;
         }
      }
      else
      {
         //continue process... your code here
      }
   }
}

private void frmCmsnDownload_FormClosing(object sender, FormClosingEventArgs e)
{
   if (bgWorker.IsBusy)
   {
      pauseWorker = true; //this will trigger the dowork event to loop that
                          //checks if pauseWorker is set to false
      DiaglogResult x = MessageBox.Show("You are about cancel the process", "Close", MessageBoxButtons.YesNo);
      if (x == DialogResult.Yes) bgWorker.CancelAsync();
      else 
      { 
         e.Cancel = true; 
         pauseWorker = false; //if the user click no
                              //the do work will continue the process
         return;
      }
   }
}

したがって、ここでの主な解決策は、BGWorker の DoWork イベントを制御するブール宣言です。この解決策があなたの問題に役立つことを願っています。ありがとうございました。

于 2016-11-26T03:54:53.627 に答える
0

このようなものを使用してこれを行うことができるはずManualResetEventです...

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
{
    _busy.WaitOne();
    test(mainUrl, levelsToCrawl, e); 
}

...そして、スレッド呼び出しを一時停止したい_busy.Reset()とき...そして再開したいときは呼び出します_busy.Set()

さらに、_busy.WaitOne();一時停止したい場所ならどこにでも配置できます。

于 2012-10-08T11:16:26.557 に答える