2012-04-12 10 views
1

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

ありがとうございます。

+0

は私たちにBackgroundWorkerのコードをしてください表示... – Marco

+0

これは私が考えて重複している - ここでは、この答えを参照してくださいhttp://stackoverflow.com/questions/ 10047571 /適切なアプローチの一時的な一時停止 - ワーカースレッド/ 10047990#10047990 – NSGaga

+0

現在の進捗値も保持するクラスの中にバックグラウンドワーカーをカプセル化することができます。したがって、一時停止すると(この場合は非同期操作をキャンセルしています)、進行状況の値が保持されるだけなので、次回に操作を再開すると最後の進行状況に戻ることができます。お役に立てれば。 – cubski

答えて

0

はこれに私のアプローチは私が運転を一時停止(そしておそらく二つ目は私がいるか否かを知らせるされているかどうかを知っているように、ブールフラグを使用することです。この

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);  
     } 
    } 
} 
+0

ありがとうございました。 – Likurg

1

を使用してみてください操作がキャンセルされます)。ユーザーが一時停止ボタンを押すと、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. 
    } 
} 
関連する問題