zoukankan      html  css  js  c++  java
  • 委托的BeginInvoke和EndInvoke

    刚刚搞明白了C#的异步调用,写下来,方便后续调用。

    异步主要是解决UI假死的问题,而开辟出一个新的线程,处理大数据。

    1.既然是委托的调用,那么先定义个委托:

    public delegate bool CheckUpdateFile();

    2.定义一个将要工作的委托函数,和委托类型一致

    private bool Press()
            {
                //处理大数据
                //如读取大文件,网络通讯等
                return true;
            }
    

     3.声明及初始化委托实例,运行该实例

    BeginInvoke( AsyncCallback callback,object @object) //原型

    需要一个带有IAsyncResult 参数类型的函数,如:private void callback(IAsyncResult ar)

    CheckUpdateFile fun = new CheckUpdateFile(Press);
    fun.BeginInvoke(callback, fun);
    //回调函数
    private void callback(IAsyncResult ar)//该参数功能强大,万能型,可以传object
            {
                if (!ar.IsCompleted) return;//没有完成,不结束改线程。
                var fun = (CheckUpdateFile)ar.AsyncState;//强类型转换为委托对象
           //var sar = (AsyncResult)ar; 
           //var fun= (MyDelegate)sar.AsyncDelegate;  var isok = fun.EndInvoke(ar);//结束后返回委托Press的结果 if (isok) { Invoke((EventHandler)delegate { //匿名方法体,委托完成后,将要做什么。 }); } }

    二、还可以使用匿名函数来写

    var fun = new CheckUpdateFile(Press);
    fun.BeginInvoke(ar =>
    {
          if (!ar.IsCompleted) return;
          //var fun = (CheckUpdateFile)ar.AsyncState;声明在前部分,不需要转换。
          var isok = fun.EndInvoke(ar);//结束后返回委托Press的结果
    if (isok) { Invoke((EventHandler)delegate { }); } }, fun);//fun可写为null,匿名函数中不需要转换
  • 相关阅读:
    HTTPS安全超文本传输协议
    前端性能监控工具
    跨域:跨域及解决方法
    源码安装nginx
    浏览器工作原理(四):浏览器事件解读
    浏览器工作原理(三):js运行机制及Event Loop
    前端性能优化:gzip压缩文件传输数据
    Vue源码学习(零):内部原理解析
    netsh命令操作ipsec
    netsh命令操作防火墙
  • 原文地址:https://www.cnblogs.com/ankeyliu/p/4552367.html
Copyright © 2011-2022 走看看