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);
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();
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);
}
}
}
}
Mobile version