C# 异步学习笔记

正常委托的调用方法为: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);

猜你喜欢

转载自www.cnblogs.com/bamboo-zhang/p/9136083.html