/// <summary>
        /// Run an async task. This method will block execution (and use the calling thread as a worker thread) until the async task has completed.
        /// </summary>
        public static void Run(Func <Task> main, int degreeOfParallelism = 1)
        {
            var asyncOperatingContext = new AsyncOperatingContext();

            asyncOperatingContext.DegreeOfParallelism = degreeOfParallelism;
            asyncOperatingContext.RunMain(main);
        }
        /// <summary>
        /// Run an async task. This method will block execution (and use the calling thread as a worker thread) until the async task has completed.
        /// </summary>
        public static T Run <T>(Func <Task <T> > main, int degreeOfParallelism = 1)
        {
            var asyncOperatingContext = new AsyncOperatingContext();

            asyncOperatingContext.DegreeOfParallelism = degreeOfParallelism;
            return(asyncOperatingContext.RunMain(main));
        }