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)); }
/// <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); }
/// <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()); }