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
Patricia ArquetteOriginal
2025-01-20 01:07:09998Durchsuche

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>

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!

Stellungnahme:
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