Очистка фоновых задач в классах Dispose() без риска тупикаC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Очистка фоновых задач в классах Dispose() без риска тупика

Сообщение Anonymous »

Иногда у меня есть класс, который в фоновом режиме выполняет некоторые асинхронные действия, обычно работающие в сети или другие операции ввода-вывода. Я хочу, чтобы он остановился и очистился, если вызывается Dispose(), но кажется, что этот шаблон может привести к взаимоблокировке, если каким-то образом Dispose() был вызван из самой фоновой задачи (я подозреваю, что аналогичный ошибка возможна и с простыми потоками).
  • A TaskCompletionSource.SetResult и т. д. в той или иной форме может вызвать некоторое внешнее ожидание чтобы продолжить поток, в котором выполнялась фоновая задача, которая затем вызывала Dispose.
  • Иногда фоновая задача вызывала обратный вызов/событие, и каким-то образом это в конечном итоге заканчивалось вызовом Dispose перед возвратом.
  • li>
Существует ли стандартный шаблон для безопасного выполнения фоновых операций, например сетевых клиентов?
  • Должен ли я избегать использования функций Dispose(), ожидающих завершения фоновых операций, и использовать какой-либо другой метод, чтобы гарантировать, что все остановлено, прежде чем вернуться из основного?
  • Всегда ли это вина кода? вызов Dispose(), чтобы это произошло из «обратного вызова» (кажется, что многие библиотеки скажут это при использовании традиционных потоков, но потенциальное переключение контекста await foo значительно усложняет управление потоками)?
    Следует ли избегать фоновых задач, вызывающих обратные вызовы в отдельном потоке (events/Action/Func, subject.OnNext(), TaskCompletionSource.SetResult() и т. д.)?
Очень упрощенный пример, который может сломаться. Обычно BackgroundTask представляет собой что-то вроде WebSocket или другой сетевой службы, которая зависает до тех пор, пока приложение не будет закрыто.


Подробнее здесь: https://stackoverflow.com/questions/790 ... g-deadlock
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Очистка фоновых задач в классах Dispose() без риска тупика
    Anonymous » » в форуме C#
    0 Ответы
    15 Просмотры
    Последнее сообщение Anonymous
  • Шаблон Dispose в C#: реализация Dispose и GC.SuppressFinalize
    Anonymous » » в форуме C#
    0 Ответы
    23 Просмотры
    Последнее сообщение Anonymous
  • Шаблон Dispose в C#: реализация Dispose и GC.SuppressFinalize
    Anonymous » » в форуме C#
    0 Ответы
    30 Просмотры
    Последнее сообщение Anonymous
  • Шаблон Dispose в C#: реализация Dispose и GC.SuppressFinalize
    Anonymous » » в форуме C#
    0 Ответы
    23 Просмотры
    Последнее сообщение Anonymous
  • Задача тупика в системе распределения ресурсов с динамическими зависимостями задач с динамическими задачами
    Anonymous » » в форуме C++
    0 Ответы
    16 Просмотры
    Последнее сообщение Anonymous

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