コード例 #1
0
        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;
        }
コード例 #2
0
        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);
        }
コード例 #3
0
        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);
        }