• 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);
    将偷懒进行到极致,是一个程序员的基本素养
  • 相关阅读:
    关于效应量
    sc 与 net 命令
    隐函数求导
    关于向量空间的基本性质,与子空间的最最基本性质
    生成随机数(C++)
    关于 setw() 函数(C++)
    关于 加减乘除 基本运算的性质
    为什么文件无法用wps打开,甚至wps.exe本身都无法打开?
    with open()函数中,如何在文件名设置中引用变量(python)
    pygame 运行心理学问卷
  • 原文地址:https://www.cnblogs.com/bamboo-zhang/p/9136083.html
Copyright © 2020-2023  润新知