zoukankan      html  css  js  c++  java
  • 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);
    将偷懒进行到极致,是一个程序员的基本素养
  • 相关阅读:
    oracle 自增序列实现 可作为主键
    oracle 10 升级补丁
    软件设计原则
    oracle查询截至到当前日期月份所在年份的所有月份
    Dockerfile 基本命令
    Mybatis自动生成代码,MyBatis Generator
    Java垃圾回收机制
    SqlServer 导入 .sql 文件
    备份个清库脚本
    备份一些开发配置
  • 原文地址:https://www.cnblogs.com/bamboo-zhang/p/9136083.html
Copyright © 2011-2022 走看看