Exemple #1
0
        internal static void Run <T>(IEnumerator <IAsync> en, Action <T> cont)
        {
            if (!en.MoveNext())
            {
                throw new InvalidOperationException("Asynchronous workflow executed using"
                                                    + "'AsyncWithResult' didn't return result using 'Result'!");
            }

            var res = (en.Current as Result <T>);

            if (res != null)
            {
                cont(res.ReturnValue); return;
            }

            en.Current.ExecuteStep
                (() => AsyncExtensions.Run <T>(en, cont));
        }
Exemple #2
0
        /// <summary>
        /// Executes asynchronous method and blocks the calling thread until the operation completes.
        /// </summary>
        /// <param name="async"></param>
        public static void ExecuteAndWait(this IEnumerable <IAsync> async)
        {
            // 信号量初始化false,当调用set后,会唤醒阻塞的线程
            ManualResetEvent wh = new ManualResetEvent(false);

            AsyncExtensions.Run(async.GetEnumerator(),
                                () => {
                Console.WriteLine("SET: Current Thread Id :{0}", Thread.CurrentThread.ManagedThreadId);
                wh.Set();
            }
                                );
            Console.WriteLine("ExecuteAndWait: Current Thread Id :{0}", Thread.CurrentThread.ManagedThreadId);

            // 主线程阻塞,等待set唤醒
            wh.WaitOne();

            Console.WriteLine("ExecuteAndWaitEND: Current Thread Id :{0}", Thread.CurrentThread.ManagedThreadId);
        }
Exemple #3
0
 /// <summary>
 /// Spawns the asynchronous method without waiting for the result.
 /// </summary>
 /// <param name="async"></param>
 public static void Execute(this IEnumerable <IAsync> async)
 {
     AsyncExtensions.Run(async.GetEnumerator());
 }