Frage

Ich habe versucht, vor kurzem anstelle von „klassischen“ Threads zu verwenden Background und ich erkennen, dass es verursacht, zumindest für mich, mehr Probleme als Lösungen. Ich habe einen Background einen synchronen Lese läuft (in diesem Fall von Serieller_Anschluss) und immer rund 30 Sekunden in 1 Codezeile gesperrt, dann cancellationpending ist nicht die Lösung. Ich sehe, dass, wenn die Anwendung wird an dieser Stelle (entweder mit dem Kreuzknopf und Application.Exit ()) geschlossen der Prozess Zombie hält für immer.

Ich brauche eine Art und Weise Abbruch zu zwingen oder den Background Thread zu töten.

War es hilfreich?

Lösung

Ich bin mir nicht ganz sicher, was Sie erreichen wollen, aber vielleicht die SerialPort.DataReceived Fall eine bessere Lösung?

Wenn Sie bereits geübt sind mit der Verwendung von Threads, ich sehe nicht den Punkt in Background verwenden. Es wird entwickelt für Menschen, die nicht über Gewinde in erster Linie verstehen.

Außerdem, ich weiß nicht, wie die Idee, einen Thread abzubrechen. Es fühlt sich gefährlich und Multithreading-Anwendungen benötigen keine mehr Risiko einzugehen.

Andere Tipps

Ich habe eine zusammen, dass (glaube ich) macht den Job. Bitte lassen Sie mich wissen, ob im waaaay aus. Hier ist ein einfaches exaple, wie es funktioniert.

var backgroundWorker = new BackgroundWorker(){WorkerSupportsCancellation = true};

backgroundWorker.DoWork += (sender, args) =>
         {                 
                 var thisWorker = sender as BackgroundWorker;
                 var _child = new Thread(() =>
                                               {
                                                   //..Do Some Code

                                               });
                 _child .Start();
                 while (_child.IsAlive)
                 {
                     if (thisWorker.CancellationPending)
                     {
                         _child.Abort();
                         args.Cancel = true;
                     }
                     Thread.SpinWait(1);
                 }                 
         };

 backgroundWorker.RunWorkerAsync(parameter);
 //..Do Something...
backgroundWorker.CancelAsync();

Da der Hintergrund Arbeiter Teil des Thread-Pools ist, dass wir nicht wollen, es abzubrechen. Aber wir können einen Thread intern laufen, die wir ein Abbruch auf auftreten lassen kann. Die Background dann läuft grundsätzlich bis entweder das Kind Thread abgeschlossen ist oder wir signalisieren sie den Prozess zu töten. Der Hintergrund Worker-Thread kann dann in die Lese Pool zurück. Typischerweise dass Gewinde in das Kind übergeben als Parameter laufen Ich werde diese wickeln in einer Hilfsklasse und gehen durch die delegierte Methode, die ich der Hintergrund-Thread wollen und ausgeführt werden.

Bitte jemand lassen Sie mich wissen, wenn im Kopf gegen eine Wand schlagen, aber es scheint gut zu funktionieren .. Aber das ist das Problem mit Threads es ist nicht .. die unterschiedlichen Ergebnisse, die Sie erhalten, wenn Sie es zu verschiedenen Zeiten ausgeführt werden.

Der Prozess sollte nicht zu einem Zombie, da die Background Thread als „Hintergrund“ gekennzeichnet ist und sollte enden, wenn der UI geschlossen ist.

Das glaube ich nicht die Tötung Background des Fadens unterstützt. eine Operation abbrechen müssen in dem Verfahren durchgeführt werden, der den Auftrag ausführt. In Ihrem Fall denke ich, ein regelmäßiger Thread wird die beste Option sein.

Sie können versuchen, diese:

            backgroundworker.Dispose();
            backgroundworker = null;
            GC.Collect(); //this helps cleans up ram
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top