解决 args 变量没有赋值导致的参数传递失败的问题。by Soar360
大石头 编写于 2023-09-09 07:16:48
X
using System;
using System.Diagnostics.Contracts;
using System.Runtime.CompilerServices;
using System.Threading.Tasks;

#if NET40
namespace Microsoft.Runtime.CompilerServices
{
    /// <summary>配置任务await</summary>
    public struct ConfiguredTaskAwaitable
    {
        /// <summary>配置任务await</summary>
        public struct ConfiguredTaskAwaiter : ICriticalNotifyCompletion, INotifyCompletion
        {
            private readonly Task m_task;

            private readonly bool m_continueOnCapturedContext;

            /// <summary>是否已完成</summary>
            public bool IsCompleted { get { return m_task.IsCompleted; } }

            internal ConfiguredTaskAwaiter(Task task, bool continueOnCapturedContext)
            {
                Contract.Assert(task != null, null);
                m_task = task;
                m_continueOnCapturedContext = continueOnCapturedContext;
            }

            /// <summary>指定的 awaiter 完成时,安排状态机,以继续下一操作。</summary>
            /// <param name="continuation"></param>
            public void OnCompleted(Action continuation)
            {
                TaskAwaiter.OnCompletedInternal(m_task, continuation, m_continueOnCapturedContext);
            }

            /// <summary>指定的 awaiter 完成时,安排状态机,以继续下一操作。此方法可从部分受信任的代码调用。</summary>
            /// <param name="continuation"></param>
            public void UnsafeOnCompleted(Action continuation)
            {
                TaskAwaiter.OnCompletedInternal(m_task, continuation, m_continueOnCapturedContext);
            }

            /// <summary>将任务标记为已成功完成。</summary>
            public void GetResult() { TaskAwaiter.ValidateEnd(m_task); }
        }

        private readonly ConfiguredTaskAwaiter m_configuredTaskAwaiter;

        internal ConfiguredTaskAwaitable(Task task, bool continueOnCapturedContext)
        {
            Contract.Assert(task != null, null);
            m_configuredTaskAwaiter = new ConfiguredTaskAwaiter(task, continueOnCapturedContext);
        }

        /// <summary>获取await</summary>
        /// <returns></returns>
        public ConfiguredTaskAwaiter GetAwaiter() { return m_configuredTaskAwaiter; }
    }

    /// <summary>配置任务await</summary>
    /// <typeparam name="TResult"></typeparam>
    public struct ConfiguredTaskAwaitable<TResult>
    {
        /// <summary>配置任务await</summary>
        public struct ConfiguredTaskAwaiter : ICriticalNotifyCompletion, INotifyCompletion
        {
            private readonly Task<TResult> m_task;

            private readonly bool m_continueOnCapturedContext;

            /// <summary>是否已完成</summary>
            public bool IsCompleted { get { return m_task.IsCompleted; } }

            internal ConfiguredTaskAwaiter(Task<TResult> task, bool continueOnCapturedContext)
            {
                Contract.Assert(task != null, null);
                m_task = task;
                m_continueOnCapturedContext = continueOnCapturedContext;
            }

            /// <summary>指定的 awaiter 完成时,安排状态机,以继续下一操作。</summary>
            /// <param name="continuation"></param>
            public void OnCompleted(Action continuation)
            {
                TaskAwaiter.OnCompletedInternal(m_task, continuation, m_continueOnCapturedContext);
            }

            /// <summary>指定的 awaiter 完成时,安排状态机,以继续下一操作。此方法可从部分受信任的代码调用。</summary>
            /// <param name="continuation"></param>
            public void UnsafeOnCompleted(Action continuation)
            {
                TaskAwaiter.OnCompletedInternal(m_task, continuation, m_continueOnCapturedContext);
            }

            /// <summary>将任务标记为已成功完成。</summary>
            public TResult GetResult()
            {
                TaskAwaiter.ValidateEnd(m_task);
                return m_task.Result;
            }
        }

        private readonly ConfiguredTaskAwaiter m_configuredTaskAwaiter;

        internal ConfiguredTaskAwaitable(Task<TResult> task, bool continueOnCapturedContext)
        {
            m_configuredTaskAwaiter = new ConfiguredTaskAwaiter(task, continueOnCapturedContext);
        }

        /// <summary>获取await</summary>
        /// <returns></returns>
        public ConfiguredTaskAwaiter GetAwaiter() { return m_configuredTaskAwaiter; }
    }
}
#endif