Управление асинхронными задачами при завершении работы в приложениях .NETC#

Место общения программистов C#
Ответить
Anonymous
 Управление асинхронными задачами при завершении работы в приложениях .NET

Сообщение Anonymous »

У меня есть следующий класс под названием MessageSaver в dll под названием MessageSaver.dll. Эта dll может использоваться приложением .NET для сохранения сообщений в текстовый файл. Приложение .NET может быть приложением Winforms, приложением WPF, приложением ASP.NET или консольным приложением.
Я пытаюсь корректно обрабатывать запросы на сохранение сообщений, когда приложение, использующее эту dll, начинает завершать работу.
Эта dll может использоваться приложением Winforms, приложением WPF или приложением ASP.Net или консольным приложением с использованием этого кода:
var filePath = "c\\abc\\xyz\\efg\\msg.txt";
var content = "some message";
MessageSaver saver = new MessageSaver();
await saver.SaveMessageAsync(filePath, content);

Прямо сейчас я реализовал некоторый код для корректной обработки этой проблемы, как описано ниже.
Метод Shutdown будет вызываться кодом приложения с использованием MessageSaver.dll в соответствующем событии завершения работы/выхода процесса.
//in the shutdown event of the application, this code needs to be there
MessageSaver saver = new MessageSaver();
saver.Shutdown();

Я рассматриваю это так: когда приложение инициирует завершение работы, тогда может быть один или несколько запросов на сохранение сообщений; некоторые из этих запросов не достигли бы стадии FileStream в методе SaveMessageAsync, в то время как другие могли бы.
Для тех запросов, которые не достигли стадии FileStream, метод SaveMessageAsync будет завершен в зависимости от состояния _shutdownTokenSource. Для запросов, которые достигли стадии FileStream или прошли ее, WriteLineAsync предотвращается путем просмотра статуса _shutdownTokenSource.
Но что происходит с запросами, прошедшими стадию FileStream и начавшими запись, т. е. ожидание sw.WriteLineAsync(content) достигнуто? Я не знаю, как обрабатывать такие запросы при завершении работы. Насколько я понимаю, такие запросы будут ожидаться до завершения работы приложения, и поэтому мне не нужно беспокоиться о неудаленных дескрипторах файлов для этих запросов.
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);
}
}
}
}


Подробнее здесь: https://stackoverflow.com/questions/798 ... n-net-apps
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»