Вопрос безопасности потоков и утилизации несколько сложен.Поскольку во многих случаях единственное, что любой поток может законно сделать с объектом после того, как любой другой поток начал распоряжаться им, это попытка удалить его самостоятельно, на первый взгляд кажется, что единственное, что необходимо для обеспечения безопасности потока, этоиспользуйте Interlocked.Exchange для флага 'disposed', чтобы убедиться, что попытка Dispose одного потока происходит, а другой игнорируется.Действительно, это хорошая отправная точка, и я думаю, что она должна была быть частью стандартного шаблона Dispose (CompareExchange должен был быть выполнен в запечатанном методе-оболочке базового класса, чтобы избежать необходимости для каждого производного класса использовать свой собственныйраспоряжаться флагом).К сожалению, если учесть, что на самом деле делает Dispose, все гораздо сложнее.
Истинная цель Dispose - не сделать что-то для объекта, который должен быть удален, а скорее очистить другие объекты, которые этот объект содержитРекомендации.Эти объекты могут быть управляемыми объектами, системными объектами или чем-то еще целиком;они могут даже не находиться на том же компьютере, что и находящийся объект.Для Dispose, чтобы быть потокобезопасным, эти другие объекты позволили бы Dispose очистить их в то же время, как другие потоки могут делать с ними другие вещи.Некоторые объекты могут справиться с таким использованием;другие не могут.
Один конкретный неприятный пример: объектам разрешено иметь события с методами RemoveHandler, которые не являются поточно-ориентированными.Следовательно, любой метод Dispose, который очищает обработчики событий, должен вызываться только из того же потока, в котором создавались подписки.