[转]C# Invoke的使用方法

在多线程编程中,我们经常要在工作线程中去更新界面显示,而在多线程中直接调用界面控件的方法是错误的做法,Invoke 和 BeginInvoke 就是为了解决这个问题而出现的,使你在多线程中安全的更新界面显示。

正确的做法是将工作线程中涉及更新界面的代码封装为一个方法,通过 Invoke 或者 BeginInvoke 去调用,两者的区别就是一个导致工作线程等待,而另外一个则不会。

而所谓的“一面响应操作,一面添加节点”永远只能是相对的,使 UI 线程的负担不至于太大而已,因为界面的正确更新始终要通过 UI 线程去做,我们要做的事情是在工作线程中包揽大部分的运算,而将对纯粹的界面更新放到 UI 线程中去做,这样也就达到了减轻 UI 线程负担的目的了。

再举个简单例子说明下使用方法,比如你在启动一个线程,在线程的方法中想更新窗体中的一个TextBox..

        using System.Threading;

       public delegate void MyInvoke(string str);
        private void btnStartThread_Click(object sender, EventArgs e)
        {
            Thread thread = new Thread(new ThreadStart(DoWord));
            thread.Start();
        }
        public void DoWord()
        {
            MyInvoke mi = new MyInvoke(SetTxt);
            BeginInvoke(mi,new object[]{"abc"});
        }

        public void SetTxt(string str)
        {
            txtReceive.Text += str + System.Environment.NewLine;
        } 

原文:http://www.cnblogs.com/lovko/archive/2008/12/19/1358748.html

时间: 2024-08-27 10:33:37

[转]C# Invoke的使用方法的相关文章

[转载]Winform中Control的Invoke与BeginInvoke方法

转自http://www.cppblog.com/baby-fly/archive/2010/04/01/111245.html 一.为什么 Control类提供了 Invoke和 BeginInvoke机制? 关于这个问题的最主要的原因已经是 dotnet程序员众所周知的,我在此费点笔墨再次记录到自己的日志,以便日后提醒一下自己. 1. windows程序消息机制 Windows GUI程序是基于消息机制的,有个主线程维护着一个消息泵.这个消息泵让 windows程序生生不息. Windows

Invoke()方法的使用

在多线程编程中,我们经常要在工作线程中去更新界面显示,而在多线程中直接调用界面控件的方法是错误的做法,Invoke 和 BeginInvoke 就是为了解决这个问题而出现的,使你在多线程中安全的更新界面显示. 正确的做法是将工作线程中涉及更新界面的代码封装为一个方法,通过 Invoke 或者 BeginInvoke 去调用,两者的区别就是一个导致工作线程等待,而另外一个则不会. 而所谓的“一面响应操作,一面添加节点”永远只能是相对的,使 UI 线程的负担不至于太大而已,因为界面的正确更新始终要通

java反射机制之Method invoke执行调用方法例子

昨天在群里跟大家讨论了下java反射调用可变参数的问题,这个问题起因是我们需要反射调用另一个部门提供的方法,我同事说java不能反射调用可变参数的方法,于是我写了个demo证明了他这个观点的错误.但是测试过程中,有一点我不明白,就是反射调用可变参数的方法时,为什么一定要保证传入的参数数组长度为1,在群里跟大家讨论了很多,没有得到确切的答案,参照网上大牛写的东西和我自己跟源码的过程,记录如下: 1.两个类,一个父类,一个子类 [java] view plain copy print? packag

普通方法调用,Invoke,begininvoke三者的区别总结

(1)普通方法调用(直接调用)与Invoke()方法调用方法 使用的线程Id是一样的 即属于同步. (2)BeginInvoke(<输入和输出变量>,AsyncCallback callback,object asyncState)方法调用方法 则是启用了新的线程Id       属于异步 可通过 Thread.CurrentThread.ManagedThreadId    获取当前线程的Id *委托类型的BeginInvoke(<输入和输出变量>,AsyncCallback c

在子线程实现自己的Invoke方法

笔者最近在做项目的时候,遇到一个这样的问题:厂商提供的SDK,里面的某些资源必须要在子线程中创建,并且相应资源中的操作也必须在相应的线程中调用.类似与Winform中更新控件必须要将相应的操作委托给拥有控件的线程去处理,Control类中的Invoke以及BeginInvoke方法.本人愚钝,没有想到好的方法,用了一个比较简单的实现方式. 废话少说,直接上代码: 1 class ThreadObject 2 { 3 private AutoResetEvent startEvent = new

看看Parallel中高度封装的三个方法,Invoke,For和ForEach

说到.net中的并行编程,也许你的第一反应就是Task,确实Task是一个非常灵活的用于并行编程的一个专用类,不可否认越灵活的东西用起来就越 复杂,高度封装的东西用起来很简单,但是缺失了灵活性,这篇我们就看看这些好用但灵活性不高的几个并行方法. 一:Invoke 现在电子商务的网站都少不了订单的流程,没有订单的话网站也就没有存活的价值了,往往在订单提交成功后,通常会有这两个操作,第一个:发起 信用卡扣款,第二个:发送emial确认单,这两个操作我们就可以在下单接口调用成功后,因为两个方法是互不干

MethodHandle(方法句柄)系列之三:invoke和invokeExact的区别

先把代码贴上来,用的是一样的代码 /** * * @author LiuYeFeng<[email protected]> * @date 2015年4月8日 下午10:41:13 * @CopyRight 2015 TopView Inc * @version V1.0 */ public class MethodHandleTest { public MethodHandle getHandler() { MethodHandle mh = null; MethodType mt = Me

C#学习之在辅助线程中修改UI控件----invoke方法

Invoke and BeginInvoke 转载地址:http://www.cnblogs.com/worldreason/archive/2008/06/09/1216127.html 在Invoke或者BeginInvoke的使用中无一例外地使用了委托Delegate,至于委托的本质请参考我的另一随笔:对.net事件的看法. 一.为什么Control类提供了Invoke和BeginInvoke机制? 关于这个问题的最主要的原因已经是dotnet程序员众所周知的,我在此费点笔墨再次记录到自己

java反射的invoke方法

首先简单介绍两个元注解:@retention是() 括号内参数作用时间 编译.运行.源码@target()  括号内参数作用范围 变量,方法.... //获取class对象 Class clazz = Class.forName("cn.ph.test.UserDao"); //获取对象方法 Method[] mds = clazz.getMethods(); //遍历 for(Method md : mds){ /** *@MyTest.class 注解码对象 *invake(Obj