Heim > Backend-Entwicklung > C++ > Wie kann man lang laufende Aufgaben in .NET sicher unterbrechen, ohne Thread.Abort() zu verwenden?

Wie kann man lang laufende Aufgaben in .NET sicher unterbrechen, ohne Thread.Abort() zu verwenden?

Patricia Arquette
Freigeben: 2025-01-20 01:07:09
Original
997 Leute haben es durchsucht

How to Safely Interrupt Long-Running Tasks in .NET Without Using Thread.Abort()?

.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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage