Это плохая идея написать метод Dispose / Close, который будет асинхронным? - PullRequest
10 голосов
/ 01 июня 2011

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

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

Ответы [ 4 ]

5 голосов
/ 01 июня 2011

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

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

4 голосов
/ 01 июня 2011

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

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

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

1 голос
/ 01 июня 2011

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

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

0 голосов
/ 01 июня 2011

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

...