您的位置:首页 > 编程语言 > C#

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

2013-01-21 13:02 429 查看
首先无论是那个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(个人意见-如有更好见解请留言-或发邮件
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: