正常委托的调用方法为:Invoke()
异步委托的调用方法为:BeginInvoke()
BeginInvoke()的倒数第二个参数为回调参数,最后一个参数为回调函数的传入值
如果申明一个变量来记录BeginInvoke的值,可以使用此变量值进行等待
var asyncResult = method.BeginInvoke("委托的传入值", callback, "回调函数需要传入的值"); //主线程等待异步执行结束 int i = 1; while (!asyncResult.IsCompleted) { Console.WriteLine("*****正在计算,已完成{0}%。。。。", 10 * i++); Thread.Sleep(100); }
上面的等待方式时间并不精确,下面两种方法可以保证异步执行完成马上回到主线程(使等待更精确)
asyncResult.AsyncWaitHandle.WaitOne();//一直等待 asyncResult.AsyncWaitHandle.WaitOne(-1);//一直等待
还可以设置等待的时间
asyncResult.AsyncWaitHandle.WaitOne(1000);//等待1000毫秒,超时就不等待了
附:委托三部曲
1、申明委托;2、实例化委托;3、调用委托
private delegate void DoSomethingDelegate(string name);//1 DoSomethingDelegate method = new DoSomethingDelegate(this.DoSomethingLong);//2 callback.Invoke("myName")//3
委托的简写形式
var asyncResult1 = method.BeginInvoke("btnAsync_Click", t => { Console.WriteLine(t.Equals(asyncResult)); Console.WriteLine(t.AsyncState); Console.WriteLine("这里是回调函数 {0}", Thread.CurrentThread.ManagedThreadId); }, "回调传入值");
再次简化(使用系统提供的action 或者func)
Func<int, string> func1 = i => {
return "测试"; }; func1.Invoke(123);