1

重複の可能性:
ボタンを使用して継続的に実行中のバックグラウンド ワーカーを開始および停止する方法

最初のボタンは「連続」、2番目のボタンは「停止」という2つのボタンがあります

連続ボタンを押したときにメソッドを呼び出したい:

private void continuous_Click(object sender ,EvantArgs e) 

      {   

     // continuous taking pictures ...

      }

私の質問は:停止ボタンを押して実行を停止するにはどうすればよいですか??

写真を撮るためのコードを書き、写真を撮ることに成功しました...今、カメラに連続スナップショットを撮ってもらいたいです...しかし、停止ボタンを押すと、カメラは写真の撮影を停止するはずです...

BackGroundWorker を使用しましたが、コードが機能しません !!!

これはコードです:

private void ContinousSnaps_Click(object sender, EventArgs e)
    {

        Contiguous.DoWork += Contiguous_DoWork;
        Contiguous.RunWorkerCompleted += Contiguous_RunWorkerCompleted;
        Contiguous.RunWorkerAsync();
    }

    private void Contiguous_DoWork(object sender, DoWorkEventArgs e)
    {
        for (int i = 0; ; i++) TakeSnapShotCommand();
    }

    private void Contiguous_RunWorkerCompleted(object sender,
                                   RunWorkerCompletedEventArgs e)
    {
        MessageBox.Show("complete");
    }

    //------------------------------------------------------------------//

    private void Stop_Click(object sender, EventArgs e)
    {
        Contiguous.CancelAsync();


    }

  //--------------------------------------------------------------------//

どうすれば望む結果を達成できますか?!

4

1 に答える 1

4

これが機能するかどうか試してみてください: _DoWork イベントで:

    private void Contiguous_DoWork(object sender, DoWorkEventArgs e)
    {
        for (int i = 0; ; i++)
        {
            if (Contiguous.CancellationPending)
            {
                e.Cancel = true;
                return;
            }
            TakeSnapShotCommand();
        }
    }

そして、Stop_Click で次のようにします。

    private void Stop_Click(object sender, EventArgs e)
    {
        if (Contiguous.WorkerSupportsCancellation)
            Contiguous.CancelAsync();
    }

また、キャンセルを許可していることを確認してください (ここで私のアドバイスを聞きたい場合は、これらのイベント登録をフォーム ロードに移動して、ボタンがクリックされるたびにではなく 1 回だけ実行されるようにします。Continuous.RunWorkerAsync() だけを残します)。 ):

    // your form load <---
    private void Form1_Load(object sender, EventArgs e)
    {
        Contiguous.DoWork += Contiguous_DoWork;
        Contiguous.RunWorkerCompleted += Contiguous_RunWorkerCompleted;
        Contiguous.WorkerSupportsCancellation = true; // allowing cancellation
    }

    private void ContinousSnaps_Click(object sender, EventArgs e)
    {
        // not a bad idea if you disable the button here at this point
        Contiguous.RunWorkerAsync();
    }
于 2013-01-26T04:05:51.287 に答える