2012-04-12 7 views
1

Ich bin ein Neuling in .net Welt, so dass ich mit einem Problem konfrontiert bin, bitte helfen Sie mir, hier ist einer von ihnen, ich habe eine for-Schleife und ich habe eine backgroundWorker Kontrolle und eine progressBar Kontrollieren Sie und haben Sie auch 1 Knopf, der Identifikation: "btnPause". So meine Anforderung ist, wenn mein Formular die peogressbar lädt, zeigt den Fortschritt an, wie viel es abgeschlossen hat, wenn ich auf den Knopf (btnPause) klicke, muss der Knopftext b ändern und setze den Text als Pause, und wenn ich wieder auf diesen Knopf klicke, muss er von dem Wert, den er pausiert hat, wieder aufgenommen werden. Bitte hilf mir.How to Pause backgroundWorker in Windows Form

Vielen Dank im Voraus.

+0

Zeigen Sie uns bitte ... Background Code – Marco

+0

Dies ist ein Duplikat denke ich - sehen Sie diese Antwort hier http://stackoverflow.com/questions/ 10047571/proper-approach-for-temporary-suspending-a-worker-thread/10047990 # 10047990 – NSGaga

+0

Sie können versuchen, einen Hintergrundarbeiter innerhalb einer Klasse zu kapseln, der auch den aktuellen Fortschrittswert enthält. Wenn Sie also pausieren (was in diesem Fall die asynchrone Operation aufhebt), behält es nur den Fortschrittswert bei, so dass Sie beim nächsten Start der Operation wieder zum letzten Fortschrittswert zurückkehren können. Hoffe das hilft. – cubski

Antwort

0

Versuch zu verwenden, um diese

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

Vielen Dank für die Bearbeitung. – Likurg

1

Meine Annäherung an diesen einen boolean-Flag zu verwenden wäre mir mitteilen, ob der Betrieb angehalten (und vielleicht ein zweit ich wissen zu lassen, ob die Vorgang wird abgebrochen). Wenn der Benutzer die Pausetaste drückt, legen Sie das Flag IsPaused auf "wahr" fest, sodass der Benutzer, wenn er mit der Verarbeitung des nächsten Elements beginnt, dieses Flag überprüfen kann und weiß, dass er in einen Wartezustand versetzt werden soll.

Es gibt einige Möglichkeiten, den BackgroundWorker in diesem angehaltenen Zustand zu halten. Mein Ansatz wäre, ein ManualResetEvent zu verwenden. Dadurch kann der BackgroundWorker-Thread in einen Ruhezustand wechseln und beim Festlegen des Ereignisses beendet werden. Ich denke, das ist besser als eine while-Schleife mit einem Schlafkörper, weil der Thread bis zum Zeitpunkt des Ereignisses schläft, anstatt aufzuwachen, um zu überprüfen, ob er noch schläft. Wenn der Benutzer fortfahren möchte, kann er dieses Ereignis festlegen und den Hintergrund-Worker fortfahren lassen.

So würde der Code ein wenig wie folgt aussehen:

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. 
    } 
}