Heim >Backend-Entwicklung >C++ >Wie kann man lang laufende Aufgaben in .NET sicher unterbrechen, ohne Thread.Abort() zu verwenden?
.NET-Aufgaben sicher stoppen: Alternativen zu Thread.Abort()
Im Gegensatz zu Threads, die mit Thread.Abort()
zwangsweise gestoppt werden können, fehlt bei Aufgaben in .NET 4.0 und höher ein direktes Äquivalent für die sofortige Beendigung. Während Abbruchtoken eine elegante Ausstiegsstrategie bieten, erfordern einige Situationen eine sofortige Unterbrechung der Aufgabe.
Szenarien, die eine sofortige Beendigung der Aufgabe erfordern
Stellen Sie sich eine Windows Forms-Anwendung vor, die synchrone Webdienstaufrufe innerhalb einer Parallelschleife blockiert:
<code class="language-csharp">CancellationTokenSource cts = new CancellationTokenSource(); ParallelOptions po = new ParallelOptions(); po.CancellationToken = cts.Token; po.MaxDegreeOfParallelism = System.Environment.ProcessorCount; Parallel.ForEach(iListOfItems, po, (item, loopState) => { Thread.Sleep(120000); // Simulates a web service call });</code>
Wenn der Benutzer die Anwendung mitten im Prozess schließt, laufen die Threads der Parallelschleife weiter, was möglicherweise zu Verzögerungen und zum Einfrieren der Anwendung führt.
Über Stornierungstoken hinaus
Abbruchtoken sind ideal für eine ordnungsgemäße Beendigung, beim Blockieren von Anrufen sind sie jedoch weniger effektiv. Eine robustere Lösung beinhaltet ein boolesches Flag, stopExecuting
, das innerhalb der Task-Schleife überprüft wird, um einen sofortigen Stopp zu signalisieren:
<code class="language-csharp">bool stopExecuting; Parallel.ForEach(iListOfItems, po, (item, loopState) => { if (stopExecuting) { loopState.Stop(); return; } // Task execution code });</code>
Wenn Sie stopExecuting
auf true
setzen, werden alle laufenden Aufgaben gestoppt, wenn der Benutzer das Formular schließt. Dies beseitigt jedoch nicht Verzögerungen durch bereits laufende Blockierungsaufrufe.
Thread.Abort()
– Ein letzter Ausweg
Thread.Abort()
kann als letztes Mittel auf Threads angewendet werden, die durch die Parallelschleife erzeugt werden. Davon wird jedoch aufgrund möglicher Systeminstabilität dringend abgeraten.
Die Verwendung eines Thread-sicheren Shared-Flags und die Vermeidung von Abbruchtokens zur sofortigen Beendigung bietet einen sichereren und besser verwaltbaren Ansatz für Szenarien, die eine schnelle Aufgabenunterbrechung erfordern.
Das obige ist der detaillierte Inhalt vonWie kann man lang laufende Aufgaben in .NET sicher unterbrechen, ohne Thread.Abort() zu verwenden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!