static void DisplayResult(IAsyncResult result) { string format = (string)result.AsyncState; AsyncResult delegateResult = (AsyncResult)result; SampleDelegate delegateInstance = (SampleDelegate)delegateResult.AsyncDelegate; Console.WriteLine(format, delegateInstance.EndInvoke(result)); }
//在回调函数中儿取 static void DisplayResult(IAsyncResult result) { string format = (string)result.AsyncState; // 就是BeginInvoke的第三个参数 AsyncResult delegateResult = (AsyncResult)result; //传入的result总是一个AsyncResult实例,可用于获取原来的委托实例,从而可以调用EndInvoke SampleDelegate delegateInstance = (SampleDelegate)delegateResult.AsyncDelegate; Console.WriteLine(format, delegateInstance.EndInvoke(result)); //异步委托要调用EndInvoke有两个目的:1)获取近回值 2)防止内存泄漏 }
private void Start() { SampleDelegate counter = CountCharacters; SampleDelegate parser = Parse; var counterResult = counter.BeginInvoke("hello", null, null); var parserResult = parser.BeginInvoke("10", null, null); print("Основной поток с ID = " + Thread.CurrentThread.ManagedThreadId + " продолжает выполняться"); print("Счетчик вернул " + counter.EndInvoke(counterResult)); print("Парсер вернул " + parser.EndInvoke(parserResult)); print("Основной поток с ID = " + Thread.CurrentThread.ManagedThreadId + " завершился"); }
static void Main(string[] args) { SampleDelegate counter = new SampleDelegate(CountCharacters); SampleDelegate parser = new SampleDelegate(Parser); IAsyncResult couterResult = counter.BeginInvoke("hello", null, null); //这里不会堵塞 IAsyncResult parserResult = parser.BeginInvoke("10", null, null); //这里不会堵塞 Console.WriteLine("Main thread continuing"); Console.WriteLine("Counter returned {0}", counter.EndInvoke(couterResult)); //会在这里堵塞 Console.WriteLine("Parser returned {0}", parser.EndInvoke(parserResult)); //会在这里堵塞 Console.WriteLine("Done"); Console.ReadKey(); }
static void Main(string[] args) { // class instance Program p = new Program(); // -- delegates //FirstDelegate del = new FirstDelegate(p.Hello); //FirstDelegate del2 = new FirstDelegate(p.Hello); //FirstDelegate del3 = new FirstDelegate(p.Hello); //FirstDelegate del_comb = del + del2 + del3; //Console.WriteLine(del_comb(23)); //Console.WriteLine(del(10)); //Console.WriteLine(del(12)); //Console.WriteLine(del(23)); //Console.WriteLine(del.Method.Name); //Console.WriteLine(del.Target.ToString()); // -- events //ClassWithEvents cwe = new ClassWithEvents(); //cwe.FirstEvent += firstEventHandler; //cwe.CallEvent(34); //cwe.SomeThreadSafeEvent += SomeThreadSafeEventHandler; //cwe.CallEvent_TS(989); //Console.WriteLine(new string('-', 80)); //cwe.SomeThreadSafeEvent -= SomeThreadSafeEventHandler; //cwe.CallEvent_TS(989); // -- async delegates SampleDelegate counter = new SampleDelegate(CountCharacters); SampleDelegate parser = new SampleDelegate(Parse); // EndInvoke blocks main thread and wait for result //IAsyncResult counterResult = counter.BeginInvoke("hello", null, null); //IAsyncResult parserResult = parser.BeginInvoke("20", null, null); //Console.WriteLine("Main thread continued."); //Console.WriteLine("Counter returned : {0}",counter.EndInvoke(counterResult)); //Console.WriteLine("Parser returned : {0}",parser.EndInvoke(parserResult)); // EndInvoke not blocks main thread AsyncCallback callBack = new AsyncCallback((result) => { string format = result.AsyncState as string; AsyncResult delefateResult = result as AsyncResult; SampleDelegate delegateInstance = delefateResult.AsyncDelegate as SampleDelegate; if (delegateInstance != null) { Console.WriteLine(format, delegateInstance.EndInvoke(result)); } }); counter.BeginInvoke("hello", callBack, "Counter returned {0}"); parser.BeginInvoke("10", callBack, "Parser returned {0}"); Console.WriteLine("Main thread continued."); Console.WriteLine("Done."); Console.ReadLine(); }