Invoke和BeginInvoke的真正涵义 c begininvoke

BeginInvoke 方法真的是新开一个线程进行异步调用吗?

参考以下代码:

public delegate void treeinvoke();
     private void UpdateTreeView()
  {    
MessageBox.Show(System.Threading.Thread.CurrentThread.Name);  
}
private void button1_Click(object sender, System.EventArgs e)
{    
    System.Threading.Thread.CurrentThread.Name = "UIThread";    
    treeView1.BeginInvoke(new treeinvoke(UpdateTreeView));
}

看看运行结果,弹出的对话框中显示的是 UIThread,这说明 BeginInvoke 所调用的委托根本就是在 UI线程中

执行的。

既然是在 UI 线程中执行,又何来“异步执行”一说呢?

我们再看看下面的代码:

public delegate void treeinvoke();
private void UpdateTreeView()
{   
 MessageBox.Show(Thread.CurrentThread.Name);
}
private void button1_Click(object sender, System.EventArgs e)
{
    Thread.CurrentThread.Name = "UIThread";
    Thread th = new Thread(new ThreadStart(StartThread));
    th.Start();}
private void StartThread()
{
    Thread.CurrentThread.Name = "Work Thread";
    treeView1.BeginInvoke(new treeinvoke(UpdateTreeView));
}

再看看运行结果,弹出的对话框中显示的还是 UIThread,这说明什么?这说明 BeginInvoke 方法所调用的委托

无论如何都是在 UI 线程中执行的。

那 BeginInvoke 究竟有什么用呢?

在多线程编程中,我们经常要在工作线程中去更新界面显示,而在多线程中直接调用界面控件的方法是错误的做

Invoke和BeginInvoke的真正涵义 c begininvoke

法,具体的原因可以在看完我的这篇之后看看这篇:在多线程中如何调用Winform,如果你是大牛的话就不要看

我这篇了,直接看那篇吧,反正那篇文章我没怎么看懂。

Invoke 和 BeginInvoke 就是为了解决这个问题而出现的,使你在多线程中安全的更新界面显示。

正确的做法是将工作线程中涉及更新界面的代码封装为一个方法,通过 Invoke 或者 BeginInvoke去

调用,两者的区别就是一个导致工作线程等待,而另外一个则不会。

而所谓的“一面响应操作,一面添加节点”永远只能是相对的,使 UI 线程的负担不至于太大而以,因为界面的

正确更新始终要通过 UI 线程去做,我们要做的事情是在工作线程中包揽大部分的运算,而将对纯粹的界面更新

放到 UI 线程中去做,这样也就达到了减轻 UI 线程负担的目的了。

而在那段更新树节点的代码中,其实唯一起作用的代码是:System.Threading.Thread.Sleep(100);,它使UI

线程有了处理界面消息的机会,其实 数码幽灵 将问题复杂化了,只要以下的代码就可以很好的工作了。

private void button1_Click_(object sender, System.EventArgs e)
{
    TreeNode tn;
    for(int i=0;i<100000;i++)
    {
        tn=new TreeNode (i.ToString());
        this.treeView1.Nodes[0].Nodes.Add(tn);
        if (i0 == 0) Application.DoEvents();
    }
}转自Invoke 和 BeginInvoke 的真正涵义

  

爱华网本文地址 » http://www.413yy.cn/a/25101012/109519.html

更多阅读

MatthewMitcham和他的男友 hurricane matthew

有博友要我发MatthewMitcham和他的男友的照片,今天发出来,真心祝福他们!也祝福天下有情人终成眷属!不管你的爱人是异性还是同性,同样的祝福送给你们,诚邀你们加入《爱情随笔》书写下你们爱情的点滴片段,浪漫情怀!真情美文,真正的E时代爱情!ht

反馈回路模型——人类发展、学习、创造和天才的理论

反馈回路模型——人类发展、学习、创造和天才的理论原文:WinWenger,Image-Stream发明者,加速学习、大脑开发等领域的先驱翻译:阿扁翻译前记:这是一篇不同寻常的文章,它用一个反馈回路模型述说了人类发展、学习、创造和天才的基本原理,而

C ++ 中对象或其对象指针的赋值 c语言指针赋值

C++中对象或其对象指针的赋值C++中成员函数的动态绑定:C++中要实现函数的动态绑定,必须在其基类中将函数声明为virtual且在子类中对函数加以实现。然后用一个基类指针指向某一个子类对象,这样才会在函数调用时实现动态绑定。在C++中,只

黑枣和红枣的区别 红枣再好4类人也别吃

时间:2014-09-20 11:07来源:z.xiziwang.net 作者:lmh1176358359枣子是公认的补血益气的补品,我们嘴上经常说黑枣和红枣。到底这是怎样的两种枣呢?下面就让小编为你区分一下吧!红枣和黑枣的区别1、红枣黑枣含有不同的营养物质红枣含丰

回族与伊斯兰教、穆斯林的关系转贴 回族和穆斯林的关系

转载自回族在线长期以来,在文化上一直处于劣势的回族大众几乎没有解本民族的知识的途径,因此无论一些舆论对我们民族做出怎样的诠释和宣传(如把回族等同与穆斯林),民间很少又人去真正的思考和质疑。零散分布在各地的回族大众,多数为了生

声明:《Invoke和BeginInvoke的真正涵义 c begininvoke》为网友萊鈤侢由峩分享!如侵犯到您的合法权益请联系我们删除