public static void WriteDA <T>(EnsureAllowedDisposeState ensureAllowedDisposeState, Func <bool> isDisposed, ref T location, T value, T comparand, out bool result) where T : class { // T exchangeResult; bool locResult; ensureAllowedDisposeState(considerDisposeRequest: true); exchangeResult = Interlocked.CompareExchange(location1: ref location, value: value, comparand: comparand); if ((locResult = ReferenceEquals(exchangeResult, comparand)) && !ReferenceEquals(value, exchangeResult)) { // Установлено другое значение. // try { ensureAllowedDisposeState(considerDisposeRequest: true); } catch (ObjectDisposedException) { if (isDisposed()) { // Поскольку выгрузка завершена... // Interlocked.Exchange(ref location, null); } throw; } } result = locResult; }
public static T WriteDA <T>(EnsureAllowedDisposeState ensureAllowedDisposeState, Func <bool> isDisposed, ref T location, T value) where T : class { // T originalValue; ensureAllowedDisposeState(considerDisposeRequest: true); originalValue = Interlocked.Exchange(ref location, value); if (!ReferenceEquals(value, originalValue)) { // Установлено другое значение. // try { ensureAllowedDisposeState(considerDisposeRequest: true); } catch (ObjectDisposedException) { if (isDisposed()) { // Поскольку выгрузка завершена... // Interlocked.Exchange(ref location, null); } throw; } } return(originalValue); }
public static T WriteDA <T>(EnsureAllowedDisposeState ensureAllowedDisposeState, Func <bool> isDisposed, ref T location, T value, T comparand) where T : class { // T originalValue; ensureAllowedDisposeState(considerDisposeRequest: true); originalValue = Interlocked.CompareExchange(location1: ref location, value: value, comparand: comparand); if (ReferenceEquals(objA: originalValue, objB: comparand) && !ReferenceEquals(objA: value, objB: originalValue)) { // Value in location changed. // try { ensureAllowedDisposeState(considerDisposeRequest: true); } catch (ObjectDisposedException) { if (isDisposed()) { Interlocked.Exchange(ref location, null); } throw; } } return(originalValue); }