1

私は.net世界の初心者なので、いくつかの問題に直面しています.助けてください.ここにそれらの1つがあります.forループがあり、backgroundWorkerコントロールとprogressBarコントロールがあり、IDのボタンが1つあります:" btnPause".したがって、私の要件は、フォームが読み込まれるときにpeogressbarに進行状況が表示され、ボタンをクリックするたびに(btnPause)、ボタンのテキストを変更してテキストを一時停止として設定する必要があることです。そのボタンをもう一度クリックすると、一時停止した値から再開する必要があります。助けてください。

前もって感謝します。

4

2 に答える 2

1

これに対する私のアプローチは、ブール値フラグを使用して、操作が一時停止されているかどうかを知らせることです (おそらく、操作がキャンセルされているかどうかを知らせる 2 つ目のフラグ)。ユーザーが一時停止ボタンを押したときにIsPausedフラグを true に設定して、ワーカーが次のアイテムの処理を開始したときにこのフラグをチェックし、待機状態になることを認識できるようにします。

BackgroundWorker をこの一時停止状態に保つ方法はいくつかあります。私のアプローチは、ManualResetEvent を使用することです。これにより、BackgroundWorker スレッドはスリープ状態に入り、イベントが設定されると終了します。これは、スレッドがまだスリープ状態にある必要があるかどうかを確認するためにウェイクアップするのではなく、イベントが設定されるまでスレッドがスリープ状態のままであるため、スリープ本体で while ループを使用するよりも優れていると思います。ユーザーが続行したい場合は、このイベントを設定して、バックグラウンド ワーカーを続行させることができます。

したがって、コードは次のようになります。

private void backgroundWorker_doWork(object sender, DoWorkEventArgs args)
{
   //Initialize any pre-work stuff here.
   while(!finished)
   {
       if (Paused)
          m_evtPause.WaitOne();
       if (Cancelled)
          break;

       //lengthy thread procedure code.
   }
}
于 2012-04-12T13:32:34.970 に答える
0

Try to use this

class MyWorkerClass
{
    volatile bool m_bPaused  = false;
    // Public property to control worker execution
    public bool Paused 
    {
        get { return m_bPaused; }
        set { m_bPaused = value; }
    }

    long ThreadFunc (BackgroundWorker worker, DoWorkEventArgs e)
    {
        ...
        // While Paused property set to true
        while (m_bPaused)
        {
            // Pause execution for some time
            System.Threading.Thread.Sleep (100);      
        }
    }
}
于 2012-04-12T13:28:18.660 に答える