using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; //异步调用 //IAsyncResult BeginInvoke(argument,AsyncCallback callback,object asynState) //argument - 如果没有参数,callback就是第一个参数 //BeginInvoke返回值是IAsyncResult //AsyncState - 传递给异步调用的那个状态对象 //AsyncWaitHandle - 在异步操作完成前,一直使用WaitHandle阻断调用线程 //CompleteSynchronously - 指示一步操作是否同步完成 //IsCompleted - 指示异步操作已经完成 namespace Starter { public delegate void DeleageteClass(); class Program { static void Main(string[] args) { DeleageteClass del = MethodA; DelegateStateBag state = new DelegateStateBag(); IAsyncResult ar = del.BeginInvoke(Callback,state); if (ar.IsCompleted == true) { Console.WriteLine("MethodA completed"); } else { Console.WriteLine("MethodA not completed"); } ar.AsyncWaitHandle.WaitOne(); //do something else //Sleep - 不然会产生竞争,同时启动Callback和main,Sleep是消除竞争的根本办法 Thread.Sleep(100); lock (state) { Console.WriteLine("Back in main"); Console.WriteLine(state.message); } Console.ReadLine(); } public static void Callback(IAsyncResult ar) { DelegateStateBag state = (DelegateStateBag)ar.AsyncState ; lock(state) { Console.WriteLine("Call back running"); ((DelegateStateBag)ar.AsyncState).message = "State object modify in callack"; } } public static void MethodA() { Console.WriteLine("MethodA running...."); Thread.Sleep(200); } } class DelegateStateBag { public string message; } }
c#_delegate_异步调用_BeginInvoke
最新推荐文章于 2023-09-28 10:22:37 发布