Verwalten asynchroner Aufgaben beim Herunterfahren in .NET-AppsC#

Ein Treffpunkt für C#-Programmierer
Anonymous
 Verwalten asynchroner Aufgaben beim Herunterfahren in .NET-Apps

Post by Anonymous »

Ich habe die folgende Klasse namens MessageSaver in einer DLL namens MessageSaver.dll. Diese DLL kann von einer .NET-App zum Speichern von Nachrichten in einer Textdatei verwendet werden. Die .NET-App könnte eine Winforms-App oder eine WPF-App oder eine ASP.NET-App oder eine Konsolen-App sein.
Ich versuche, Anfragen zum Speichern von Nachrichten ordnungsgemäß zu verarbeiten, wenn die Anwendung, die diese DLL verwendet, heruntergefahren wird.
Diese DLL könnte von einer Winforms-App oder WPF-App oder ASP.Net-App oder Konsolen-App mit diesem Code verwendet werden:

Code: Select all

var filePath = "c\\abc\\xyz\\efg\\msg.txt";
var content = "some message";
MessageSaver saver = new MessageSaver();
await saver.SaveMessageAsync(filePath, content);
Im Moment habe ich Code implementiert, um dies ordnungsgemäß zu handhaben, wie unten beschrieben.
Die Shutdown-Methode wird vom Anwendungscode mithilfe der MessageSaver.dll im entsprechenden Shutdown-/Prozess-Exit-Ereignis aufgerufen.

Code: Select all

//in the shutdown event of the application, this code needs to be there
MessageSaver saver = new MessageSaver();
saver.Shutdown();
Ich betrachte das so: Wenn das Herunterfahren durch die Anwendung initiiert wird, könnte es eine oder mehrere Anfragen zum Speichern von Nachrichten geben; Einige dieser Anfragen hätten die FileStream-Stufe in der SaveMessageAsync-Methode nicht erreicht, während andere dies erreicht hätten.
Für die Anfragen, die die FileStream-Stufe nicht erreicht haben, würde die SaveMessageAsync-Methode basierend auf dem Status von _shutdownTokenSource beendet werden. Bei Anfragen, die die FileStream-Stufe erreicht haben oder darüber hinausgehen, wird WriteLineAsync verhindert, indem der Status von _shutdownTokenSource überprüft wird.
Aber was passiert mit den Anfragen, die die FileStream-Stufe überschritten haben und mit dem Schreiben begonnen haben, d. h. darauf warten, dass sw.WriteLineAsync(content) erreicht wurde? Ich bin mir nicht sicher, wie ich mit solchen Anfragen beim Herunterfahren umgehen soll. Soweit ich weiß, wird auf solche Anfragen gewartet, bevor die Anwendung heruntergefahren wird, und ich muss mir daher keine Gedanken über nicht verfügbare Dateihandles für diese Anfragen machen.

Code: Select all

public class MessageSaver {

private static readonly CancellationTokenSource _shutdownTokenSource = new();
private static readonly object _shutdownLocker = new();

public void Shutdown() {
lock(_shutdownLocker) {
_shutdownTokenSource.Cancel();
}
}

public async Task SaveMessageAsync(string filePath, string content, bool append = true) {
//cancel all new requests to save a message if the application is shutting down
if (_shutdownTokenSource.IsCancellationRequested) {
// Optionally, save to a fallback mechanism or discard the message
return;
}

using(FileStream stream = new FileStream(filePath, append ? FileMode.Append: FileMode.Create, FileAccess.Write, FileShare.None, bufferSize: 4096, useAsync: true))
using(StreamWriter sw = new StreamWriter(stream)) {
//do not save if shutdown is occurring
if (!_shutdownTokenSource.IsCancellationRequested) {
await sw.WriteLineAsync(content);
}
}
}
}

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post