В основном я хочу убедиться, что поле в классе (в данном случае _changedPoller) удалено как можно раньше, когда оно больше не нужно. Я вызываю StopChangedPolling в методе Dispose класса и при возникновении определенных событий. Каков наилучший, потокобезопасный способ удаления поля только один раз? Подходит ли следующий код?
private void StopChangedPolling()
{
IDisposable changedPoller = Interlocked.CompareExchange(ref _changedPoller, null, _changedPoller);
if (changedPoller != null)
changedPoller.Dispose();
}
Во второй раз, когда это вызывается, _changedPoller имеет значение null, и исключение не генерируется, даже несмотря на то, что в документации указано, что ArgumentNullException создается, если адрес location1 является нулевым указателем.
Interlocked.Exchange
вместоCompareExchange
. - person Kevin Gosse   schedule 18.06.2015