Неплохо ли написать метод Dispose/Close для асинхронности?

Вместо того, чтобы выполнять очистку в том же потоке (или запускать фоновый поток и блокировать до его завершения), начните очистку на "фоне" (IsBackground = false, поэтому он не прекращается досрочно) поток и немедленно возвращаются.

Когда это плохая идея и как плохо? Это хорошая идея?

Ответ 1

Замена Dispose() из IDisposable на асинхронную очистку нарушает Принцип подписки Лискова, как можно было бы ожидать, что ресурсы будут доступны снова сразу после вызова.

Я полагаю, что это какая-то оптимизация, необходимая из-за частых выделений/освобождения, что означало бы, что в конце вы могли бы просто переместить проблему на все большее количество объектов, ожидающих размещения в фоновом потоке. Это приведет к нехватке памяти в течение более длительного времени и потребует некоторой синхронизации, чтобы убедиться, что количество этих объектов не растет до неба.

Как сказал Лазарус, более подходящим решением могло бы быть объединение объектов многократного использования.

Ответ 2

Я думаю, вы бы хотели посмотреть на то, чтобы избавиться от неуправляемого ресурса по сравнению с тем, что было инициировано фоновым потоком. Если это сильно используемый процесс, вы можете обнаружить, что это создает значительные накладные расходы, если ничего другого.

Если неуправляемый ресурс очень дорог для создания и уничтожения, возможно, вы можете посмотреть на поддержание общего экземпляра или пула экземпляров на всю жизнь своего приложения.

Ответ 3

Одно место, которое вы не хотели бы делать, - это ваш объект для хранения некоторых ограниченных ресурсов, которые могут ожидать другие потоки.

Мне очень интересно видеть другие ответы, так как я думаю, что это интересная идея, и в некоторых случаях может быть приятным способом быстрее вернуть данные пользователю.

Ответ 4

Метод Dispose не должен возвращаться до тех пор, пока не будут завершены все ожидаемые эффекты, на которые может положиться другой код. Для Dispose следует отложить выполнение задач очистки, когда это не нарушит другие ожидания кода. Например, метод Dispose для класса объединения пулов может сразу добавить Disposed соединения в пул, не закрывая их, и иметь фоновый поток, закрывающий соединения, которые не использовались некоторое время. Если существует ограничение на то, сколько разных подключений может быть открыто, и запрос не может быть удовлетворен, потому что пул заполнен кэшированными (но в настоящее время неиспользуемыми) соединениями, которые не подходят для настоящего запроса, метод "Открыть" должны быть в состоянии ускорить очистку бассейна.