2017-06-07 1 views
0

Ich habe zwei Thread, die starten, wenn Benutzer Play-Taste auswählen. Wenn Sie jedoch die Schaltfläche "Pause" oder "Fortsetzen" wählen, hängt meine Benutzeroberfläche wegen Thread.Join().Was ist die Alternative von Thread.Join() zu überwinden UI Einfrieren Problem

Unten ist Code, ich suche nach einer Alternative, um dies zu überwinden. Ich habe bereits mit Invoke versucht, aber es funktioniert nicht einmal mit diesem Ansatz meine Benutzeroberfläche einfrieren den Moment ich Thread-Methoden aufrufen.

ThreadStart m_executeThreadStart; 
     Thread m_executeThread; 
     //user Selected Start Button 
     private void Start() 
     { 
      m_executeThreadStart = new ThreadStart(method1); 
      m_executeThread = new Thread(m_executeThreadStart); 
      m_executeThread.Name = "ExecuteTestSession"; 
      m_executeThread.IsBackground = true; 
      m_executeThread.Start(); 

      // Start the asynchronous operation. 
      // InitializeBackgroundWorker(); 
      // backgroundWorker1.RunWorkerAsync(); 

      //Creating result sync thread 
      ThreadStart m_resultSyncThreadStart = new ThreadStart(method2); 
      Thread m_resultSyncThread = new Thread(m_resultSyncThreadStart); 
      m_resultSyncThread.Name = "SyncResultDatabase"; 
      m_resultSyncThread.Start(); 
     } 
     private void method1() 
     { 
      //do some work 
      //read data from OPC sever (device) 
     } 
     private void method2() 
     { 
      //do some work 
      //updated database accordingly method 1 data 
     } 

     //user Press Pause button 
     public void Suspend() 
     { 
      //do work 
      m_executeThread.Join(); 
      //do work 
     } 

     //user Press Resume button 
     public void Resume() 
     { 
      //do work 
      m_executeThread.Join(); 
      //do work 
     } 
+0

Es ist unklar, warum Sie das 'Join' überhaupt ausführen. Versucht ihr in irgendeiner Weise den Thread von 'Suspend' /' Pause' vor 'Join' zu beenden? Wenn dies der Fall ist, haben Sie die Details von * wie * Sie aus dem Code, den Sie gepostet haben, vollständig entfernt. Wenn nicht, warum erwartest du dann, dass der Thread beendet wurde, als du diese Punkte getroffen hast? –

+0

@Damien_The_Unbeliever Ich versuche, Datenbankaktualisierung Prozess abzuschließen, wenn Benutzer auf Pause für die Menge der Daten, die von Methode 1 lesen. zum Beispiel, wenn ich 1000 Daten und nach dem Lesen von 50 Daten Benutzer klicken auf Pause Ich möchte für 50 Daten aktualisieren . –

Antwort

0

i Lösung gegründet, ist unten Link für Antwort.

How to pause/suspend a thread then continue it?

ManualResetEvent mrse = new ManualResetEvent(true);  

ThreadStart m_executeThreadStart; 
     Thread m_executeThread; 
     //user Selected Start Button 
     private void Start() 
     { 
      m_executeThreadStart = new ThreadStart(method1); 
      m_executeThread = new Thread(m_executeThreadStart); 
      m_executeThread.Name = "ExecuteTestSession"; 
      m_executeThread.IsBackground = true; 
      m_executeThread.Start(); 

      // Start the asynchronous operation. 
      // InitializeBackgroundWorker(); 
      // backgroundWorker1.RunWorkerAsync(); 

      //Creating result sync thread 
      ThreadStart m_resultSyncThreadStart = new ThreadStart(method2); 
      Thread m_resultSyncThread = new Thread(m_resultSyncThreadStart); 
      m_resultSyncThread.Name = "SyncResultDatabase"; 
      m_resultSyncThread.Start(); 
     } 
     private void method1() 
     { 
      //do some work 
      //read data from OPC sever (device) 
       mrse.WaitOne(); 
     } 
     private void method2() 
     { 
      //do some work 
      //updated database accordingly method 1 data 
       mrse.WaitOne(); 
     } 

     //user Press Pause button 
     public void Suspend() 
     { 
      //do work 
      mrse.Reset(); 
      //do work 
     } 

     //user Press Resume button 
     public void Resume() 
     { 
      //do work 
      mrse.Set(); 
      //do work 
     } 

Ihre Hilfe sehr geschätzt.

-1

Sie können Ihrem Hintergrund-Worker einen Event-Handler hinzufügen, dann brauchen Sie Thread.Join() nicht. Ihre Event-Handler kann dann führen Sie die notwendigen Maßnahmen, wenn der lange laufenden Prozess abgeschlossen ist:

backgroundWorker1.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker1_RunWorkerCompleted); 

private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
{ 
    // code to run after long running process has completed 
} 

Das async/await Muster wurde entworfen, um die Benutzeroberfläche zu stoppen Einfrieren (wenn korrekt implementiert) Sie dies als alternativer Ansatz verwenden könnte - https://docs.microsoft.com/en-us/dotnet/csharp/async

siehe auch: https://docs.microsoft.com/en-us/windows/uwp/debug-test-perf/keep-the-ui-thread-responsive

+0

Code hinzugefügt, um zu antworten – J45

Verwandte Themen