Example #1
0
        public static ICancelValueContainer CreateCancelContainer <TCancel>(ref TCancel reason)
        {
            ICancelValueContainer cancelValue;

            if (typeof(TCancel).IsValueType)
            {
                cancelValue = CancelContainer <TCancel> .GetOrCreate(ref reason);
            }
            else
            {
#if CSHARP_7_OR_LATER
                if (((object)reason) is ICancelationToContainer internalCancelation)
#else
                ICancelationToContainer internalCancelation = reason as ICancelationToContainer;
                if (internalCancelation != null)
#endif
                {
                    // reason is an internal cancelation object, get its container instead of wrapping it.
                    cancelValue = internalCancelation.ToContainer();
                }
                else if (ReferenceEquals(reason, null) || reason is OperationCanceledException)
                {
                    // Use void container instead of wrapping OperationCanceledException, or if reason is null.
                    cancelValue = CancelContainerVoid.GetOrCreate();
                }
                else
                {
                    // Only need to create one object pool for reference types.
                    object o = reason;
                    cancelValue = CancelContainer <object> .GetOrCreate(ref o);
                }
            }
            return(cancelValue);
        }
                public IValueContainer ToContainer(ITraceable traceable)
                {
#if CSHARP_7_OR_LATER
                    if (((object)Value) is CanceledExceptionInternal e)
#else
                    CanceledExceptionInternal e = Value as CanceledExceptionInternal;
                    if (e != null)
#endif
                    {
                        return(e);
                    }
                    return(CancelContainer <T> .GetOrCreate(Value));
                }