• C#异步和多线程


    一、异步

            1.创建一个异步

    1. //1-定义一个委托
    2. public delegate int MyCal(int num);
    3. //2-根据委托实现方法
    4. private int ExecuteTask(int num)
    5. {
    6. Thread.Sleep(5000);
    7. return num*num;
    8. }
    9. //3-调用方法
    10. MyCal objCal = ExecuteTask; //引用对应方法
    11. //1.通过委托调用BeginInvoke调用
    12. IAsyncResult Reslut = objCal.BeginInvoke(10,null,null);
    13. //输入和输出变量、回调函数、想通回调的参数object;返回异步操作状态接口类型
    14. //2.获取异步执行结果
    15. int r = objCal.EndInvoke(Reslut); //参数为:异步操作状态接口类型

            2.创建多个异步

    1. //1-定义一个委托
    2. public delegate int MyCal(int num,int ms);
    3. //2-根据委托实现方法
    4. private int ExecuteTask(int num,int ms)
    5. {
    6. Thread.Sleep(ms);
    7. return num*num;
    8. }
    9. //3-调用方法
    10. MyCal objCal = ExecuteTask; //引用对应方法
    11. //也可以使用 MyCal objCal = new MyObj(ExecuteTask);
    12. //通过for循环反复调用即可
    13. for(int i=1; i<11; i++)
    14. {
    15. objCal.BeginInvoke(10*i,1000*i,MyCallBack,i);
    16. }
    17. //4-重写回调函数
    18. private MyCallBack(IAsyncResult reslut)
    19. {
    20. int res = objMyCal.EndInvoke(result);
    21. ConSole.WirteLine("第"+result.AsyncState.ToString()+"完成结果为"+res);
    22. }

                    ①result.AsyncState的内容就是BeginInvoke最后一个参数注入的内容

                    ②重写的回调函数在执行结束时会自动触发。

                    ③BeginInvoke可以循环调用以达成多任务的效果

            3.运用Lambda表达式/匿名委托简化

    1. //1-定义一个委托
    2. public delegate int MyCal(int num,int ms);
    3. //2-使用匿名委托+Lambda表达式
    4. this.objMyCal = (num,ms) =>
    5. {
    6. System.Threading.Thread.Sleep(ms);
    7. return num*num;
    8. }

            4.异步编程的特点

                    ①建立在委托的基础上

                    ②每个方法在线程中独立运行

                    ③比较适合较为耗时的“简单任务”,要求任务直接相互独立,且不能直接访问可视化控件

                    ④不适合必须按特定顺序执行/访问共享资源,可以选择多线程

    二、多线程

            1.建议线程

    1. 1--建立线程
    2. Thread objT1 = new Thread(Func1); //单参数方法:使用前需要调用的方法<无参委托>
    3. //或使用匿名委托
    4. Thread objT2 = new Tread(delegate()
    5. {
    6. //执行代码
    7. });
    8. 2--设置后台线程
    9. objT1.IsBackground = true; //设置为后台线程
    10. 3-启动线程
    11. objT1.Start();

            2.跨线程访问控件

                    一般情况下来说,C#不允许跨线程调用控件,可以采用以下方法解决

                    ①禁用跨线程检查

    1. Control.CheckForIllegalCrossThreadCalls = false;
    2. //在Load阶段注入,关闭跨线程检查

                    ②使用Invoke方法

    1. lblResult.Invoke(new Action<string>(s=>{ lblResult.Text = s}),a.ToString());
    2. //参数为无返回委托

            3.读取和管理进程

                    需要引入命名空间:System.Diagnostics;

                    句柄(Handle):进程的标识符;在关闭进程后需要移除句柄;句柄可以通过Process对象的Handle属性访问(如退出的代码、时间)

                    ①获取本机所用进程

    1. private Process[] allProcess = null; //定义容器
    2. allProcess = Process.GetProcess(); //获取全部进程

                    ②获取进程信息

    1. Process CurrProcess = allProcess[x]; //获取某个进程
    2. ProcessModuleCollection models = CurProcess.Modules; //获取进程调用的模块的信息集
    3. foreach(ProcessModule item in models)
    4. {
    5. lblShow.Text += item.FileName; //展示所有模块信息
    6. }
    7. string info = CurrProcess.Id; //进程的ID
    8. string info = CurrProcess.Handle; //进程句柄
    9. string info = CurrProcess.HandleCount; //进程打开的句柄数
    10. string info = CurrProcess.BasePriority; //进程的优先级
    11. string info = CurrProcess.StartTime; //进程启动优先级

                    ③进程管理

    1. //立即关闭进程
    2. CurProcess.Kill();
    3. CurProcess.Close(); //释放进程资源
    4. //开启一个进程
    5. Process.Start(ProgramName); //参数为文件名(如edge.exe)
    6. Process.Start("edge.exe"."www.baidu.com"); //第二个参数为执行的路径

                    ④线程安全

                            多线程执行中的不确定性可能导致资源的争夺。可以采用加锁的方式对其进行管控

    1. //为线程代码加锁--确保里面的资源仅有当前代码能够调用
    2. lock(this)
    3. {
    4. //执行代码
    5. }
    1. //使用方法属性来实现加锁
    2. using System.Runtime.CompilerService; //引入系统编译服务
    3. //在多线程执行函数外加入属性
    4. [MethodImpl(MethondImplOptions.Synchronized)]
    5. private void ActionMethod() {}

  • 相关阅读:
    重新定义公共厕所,智慧公厕最新解决方案与推广路径
    基于多种GPU和CPU进行优化可选,最新基于机器学习模型单图换脸离线版软件包及使用方法,本地离线版本模型一键运行(免费下载)
    JavaScript设计模式之责任链模式
    java 基于 SpringMVC+Mybaties+ easyUI 快递公司管理系统 的 设计与实现
    好心情:这4种营养素能增强抗抑郁药的疗效!不知道的人亏大了
    无代码开发批量打印入门教程
    Android 属性动画ValueAnimator整理
    Blazor Server完美实现Cookie Authorization and Authentication
    Vue - 返回顶部组件,PC 端 / 移动端均适用(下滑页面到一定距离出现按钮,点击后返回顶部)
    Webmin -- Bootup and Shutdown模块
  • 原文地址:https://blog.csdn.net/weixin_37878740/article/details/126083001