У меня есть следующий класс под названием 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
Управление асинхронными задачами при завершении работы в приложениях .NET ⇐ C#
Место общения программистов C#
1765542675
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);
}
}
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79844624/managing-async-tasks-when-shutdown-occurs-in-net-apps[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия