Иногда у меня есть класс, который в фоновом режиме выполняет некоторые асинхронные действия, обычно работающие в сети или другие операции ввода-вывода. Я хочу, чтобы он остановился и очистился, если вызывается Dispose(), но кажется, что этот шаблон может привести к взаимоблокировке, если каким-то образом Dispose() был вызван из самой фоновой задачи (я подозреваю, что аналогичный ошибка возможна и с простыми потоками).
A TaskCompletionSource.SetResult и т. д. в той или иной форме может вызвать некоторое внешнее ожидание чтобы продолжить поток, в котором выполнялась фоновая задача, которая затем вызывала Dispose.
Иногда фоновая задача вызывала обратный вызов/событие, и каким-то образом это в конечном итоге заканчивалось вызовом Dispose перед возвратом.
li>
Существует ли стандартный шаблон для безопасного выполнения фоновых операций, например сетевых клиентов?
Должен ли я избегать использования функций Dispose(), ожидающих завершения фоновых операций, и использовать какой-либо другой метод, чтобы гарантировать, что все остановлено, прежде чем вернуться из основного?
Всегда ли это вина кода? вызов Dispose(), чтобы это произошло из «обратного вызова» (кажется, что многие библиотеки скажут это при использовании традиционных потоков, но потенциальное переключение контекста await foo значительно усложняет управление потоками)?
Следует ли избегать фоновых задач, вызывающих обратные вызовы в отдельном потоке (events/Action/Func, subject.OnNext(), TaskCompletionSource.SetResult() и т. д.)?
Очень упрощенный пример, который может сломаться. Обычно BackgroundTask представляет собой что-то вроде WebSocket или другой сетевой службы, которая зависает до тех пор, пока приложение не будет закрыто.
Иногда у меня есть класс, который в фоновом режиме выполняет некоторые асинхронные действия, обычно работающие в сети или другие операции ввода-вывода. Я хочу, чтобы он остановился и очистился, если вызывается Dispose(), но кажется, что этот шаблон может привести к взаимоблокировке, если каким-то образом Dispose() был вызван из самой фоновой задачи (я подозреваю, что аналогичный ошибка возможна и с простыми потоками). [list] [*]A TaskCompletionSource.SetResult и т. д. в той или иной форме может вызвать некоторое внешнее ожидание чтобы продолжить поток, в котором выполнялась фоновая задача, которая затем вызывала Dispose. [*]Иногда фоновая задача вызывала обратный вызов/событие, и каким-то образом это в конечном итоге заканчивалось вызовом Dispose перед возвратом. [*] li> [/list] Существует ли стандартный шаблон для безопасного выполнения фоновых операций, например сетевых клиентов? [list] Должен ли я избегать использования функций Dispose(), ожидающих завершения фоновых операций, и использовать какой-либо другой метод, чтобы гарантировать, что все остановлено, прежде чем вернуться из основного? [*]Всегда ли это вина кода? вызов Dispose(), чтобы это произошло из «обратного вызова» (кажется, что многие библиотеки скажут это при использовании традиционных потоков, но потенциальное переключение контекста await foo значительно усложняет управление потоками)? Следует ли избегать фоновых задач, вызывающих обратные вызовы в отдельном потоке (events/Action/Func, subject.OnNext(), TaskCompletionSource.SetResult() и т. д.)? [/list] Очень упрощенный пример, который может сломаться. Обычно BackgroundTask представляет собой что-то вроде WebSocket или другой сетевой службы, которая зависает до тех пор, пока приложение не будет закрыто.
Иногда в C# .NET Framework 4.8 у меня есть класс, который выполняет некоторые асинхронные действия в фоновом режиме, обычно работу с сетью или другие операции ввода-вывода. Я хочу, чтобы он остановился и очистился, если вызывается Dispose(), но...
Я изучаю шаблон Dispose в C# и понимаю, что метод Dispose используется при наличии неуправляемых ресурсов. Например, если у меня есть неуправляемый ресурс в FirstClass, а FirstClass содержится в классе Node, мне нужно реализовать метод Dispose для...
Я изучаю шаблон Dispose в C# и понимаю, что метод Dispose используется при наличии неуправляемых ресурсов. Например, если у меня есть неуправляемый ресурс в FirstClass, а FirstClass содержится в классе Node, мне нужно реализовать метод Dispose для...
Я изучаю шаблон Dispose в C# и понимаю, что метод Dispose используется при наличии неуправляемых ресурсов. Например, если у меня есть неуправляемый ресурс в FirstClass, а FirstClass содержится в классе Node, мне нужно реализовать метод Dispose для...
Я разрабатываю многопоточное приложение в C ++, которое управляет системой распределения ресурсов для задач с динамическими зависимостями. Каждая задача требует подмножества ресурсов (например, ядер ЦП, блоки памяти или каналы ввода -вывода) из...