• C# this.BeginInvoke()与Delegate.BeginInvoke()的区别


    首先无论是那个BeginInvoke()都是异步执行子线程函数,有些同学疑问了,异步执行是不是在子线程的函数没有执行完,
    下一次执行又开辟了新的线程进行执行呢(微软官方给出的BeginInvoke并不是多线程执行的异步)我的测试却让我对此感觉迷
    惑--下面的代码我会讲到测试代码

    (不同A)----线程的宿主不同--此处和this.Invoke()与Delegate.Invoke一样(可参考MSDN http://msdn.microsoft.com/zh-
    cn/library/vstudio/0b1bf3y3.aspx)

    (不同B)----参数不同
    方法重构(1)
    this.BeginInvoke(Delegate)参数为委托对象,此处和this.Invoke()参数相同(this.Invoke与
    this.BeginInovke到底什么不同呢--请继续看)
    方法重构(2)
    this.BeginInvoke(Delegate,args)第一个参数同上,第二参数绑定到委托上的方法需要的参数,如果不需要参
    数可以传递NULL
    Delegate.BeginInvoke(异步回调函数--不需要可以为NULL,(不知道要传递什么)-null)

    看代码----此处讲到在委托绑定的方法中如果遇到大数据量处理或者长时间的Sleep要注意的问题

    private Delegate_LED dgate = null;//委托
    private Thread myThread;//线程
    ///
    ///构造函数 
    ///
    private QueueLED()
    {
    myThread = new Thread(new ThreadStart(StartLED));//开启线程
    myThread.IsBackground = true;//后台运行,保证主程序退出时,此线程也会退出
    myThread.Start();//线程开始
    }
    private void doFunction()
    {
    //your code 
    //循环或者定时处理的或者获取的数据代码
    Thread.Sleep(1000)------------------------------特别注意到这个地方
    }

    //线程开始数据处理方法

    //------(一)使用this.BeginInvoke()的代码段-------

    private void StartLED()
    {
    try
    {
    while (true)
    {
    if(this.InvokeRequired)
    {
    dgate=doFunction;//委托绑定方法,doFunction是你要处理的数据方法
    this.BeginInvoke(dgate)//异步执行委托
    } 
    else
    {
    doFunction();
    } 
    Thread.Sleep(100);//循环Sleep
    }
    }
    catch (Exception ex)
    {
    LogRecord.RecordLog(ex.Message + ex.Source + ex.InnerException");//异常日志记录
    }
    }

    //------(二)使用Delegate.BeginInvoke()的代码段-------

    private void StartLED()
    {
    try
    {
    while (true)
    {
    dgate = UpdateFun;
    dgate.BeginInvoke(); 
    Thread.Sleep(100);
    }
    }
    catch (Exception ex)
    {
    LogRecord.RecordLog(ex.Message + ex.Source + ex.InnerException");//异常日志记录
    }
    }

    以上代码看似代码功能一样,没有什么区别(除了宿主线程不同一个是UI一个是自定义线程)--问题出现了?????

    首先上几张图片给大家(一使用Delegate.Invoke()进程详情)
    十分钟前--图片来自Windows任务管理器


    十分钟后


    程序运行10分钟后 图中1,2 没有很大变化 3,4变化也很小

    再次,使用Delegate.BeginInvoke(null,null)如图 doFunction方法中的Sleep(1000) 1秒
    十分钟前

    十分钟后

    对比结果:1和2变化不大,3和4数值变化不大,但相对于前面两张图片数量值增加了

    最后,使用Delegate.BeginInvoke(null,null)如图 doFunction方法中的Sleep(100000)100秒(重点啊)
    十分钟前

    十分钟后

    对比结果 :1,2,3,4数据猛增令人不解,先不说与之前的两次测试结果对比,单这一次,十分钟之内虚拟内存和句柄数,尤其是线程数  增加令人费解---谁能解释一下??

    所以大家在多线程处理大量并且需要长时间等待情况下,不能使用BeginInvoke(个人意见-如有更好见解请留言-或发邮件

     

  • 相关阅读:
    前端组件库
    lazyload隐藏元素不生效处理方法
    Javascript规范
    发送验证码
    flex
    css3转圈
    1.15考试总结
    [violet]蒲公英题解
    ubuntu和windows下的程序对拍
    [Poetize6] IncDec Sequence题解
  • 原文地址:https://www.cnblogs.com/jimfrank/p/begininvoke.html
Copyright © 2020-2023  润新知