首先无论是那个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(个人意见-如有更好见解请留言-或发邮件