System.Windows.Forms.Timer 的timer是在主线程上执行的,因此在timer的tick事件中操作界面上的控件不会发生线程的安全性检测。

Control的invoke和begininvoke方法的比较:

invoke方法:使用Invoke完成一个委托方法的封送,就类似于使用SendMessage方法来给界面线程发送消息,是一个同步方法。

  1. private delegate void InvokeDelegate();
  2.  
  3. private void InvokeMethod()
  4.  
  5. { //C代码段 }
  6.  
  7. private void butInvoke_Click(object sender, EventArgs e)
  8.  
  9. {
  10.  
  11. //A代码段.......
  12.  
  13. this.Invoke(new InvokeDelegate(InvokeMethod));
  14.  
  15. //B代码段......
  16.  
  17. }

invoke执行的顺序是A->C->B

beginInvoke异步方法。

  1. ControlBeginInvoke private delegate void BeginInvokeDelegate();
  2.  
  3. private void BeginInvokeMethod()
  4.  
  5. {
  6.  
  7. //C代码段
  8.  
  9. }
  10.  
  11. private void butBeginInvoke_Click(object sender, EventArgs e)
  12.  
  13. {
  14.  
  15. //A代码段.......
  16.  
  17. this.BeginInvoke(new BeginInvokeDelegate(BeginInvokeMethod));
  18.  
  19. //B代码段......
  20.  
  21. }

begininvoke执行的顺序是A->B->C

下面列出几种control的invoke方法使用:

1) Action的lambda方法的使用

Control.invoke(new Action(()=>{.....;}));

  1. new Thread(() =>
  2. {
  3. while (true)
  4. {
  5. label1.BeginInvoke(new MethodInvoker(() => { label1.Text = System.DateTime.Now.ToString(); }));
  6. Thread.Sleep();
  7. }
  8. }) { IsBackground = true }.Start();

2)实例委托

  1. private delegate void ChangeTxt();
  2. void time_Elapsed(object sender,System.Timers.ElapsedEventArgs e)
  3. {
  4. ChangeTxt changetxtDelegate=new ChangeTxt(change);
  5. textBox1.Invoke(changetxtDelegate);
    //或者直接textBox1.Invoke(new ChangeTxt(change));
  6.  
  7. }

  1. private void change() { textBox1.Text = (a++).ToString(); }

3)传参数

  1. private delegate void showtest(string text);
  2. private void run()
  3. {
  4. showtest st = new showtest(show);
  5. for (int i = ; i < ; i++)
  6. {
  7. textBox1.Invoke(st, i.ToString());
  8. }
  9. }
  10. void show(string test)
  11. {
  12. textBox1.Text = test;
  13. }

控件的invoke和beginInvoke方法的更多相关文章

  1. BackGroundWorker组件使用、Winform控件的Invoke安全调用

    BackgroundWorker是·net里用来执行多线程任务的控件,它允许编程者在一个单独的线程上执行一些操作. 可以通过编程方式创建 BackgroundWorker,也可以将它从"工具 ...

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

    转自http://www.cppblog.com/baby-fly/archive/2010/04/01/111245.html 一.为什么 Control类提供了 Invoke和 BeginInvo ...

  3. delegate的Invoke和BeginInvoke方法

    C#中的控件和delegate委托方法都有Invoke和BeginInvoke方法,控件的这两个方法网上讲得很多, 这里就不多说了,下面讲一下delegate的Invoke和BeginInvoke方法 ...

  4. 多线程访问winform控件出现异常的解决方法

    一.  多线程访问winform控件出现异常的解决方法 1.  问题描述<1> 如果创建某控件的线程之外的其他线程试图调用该控件,则会引发一个 InvalidOperationExcept ...

  5. HighChats图表控件显示精度小数点的方法

    相信大家对highchats这个图表控件并不陌生,最近在项目中用到它,但是某些字段需要显示为小数点,顾查找资料文档发现下面两个方式可以实现: 初始化时候添加如下两个参数 tooltip:{    fo ...

  6. C#中的BackgroundWorker控件+Delegate.Invoke (委托同步调用)

    C#中的BackgroundWorker控件+Delegate.Invoke (委托同步调用) 简单代码,记录一下.一个BackgroundWorker控件  backgroundWorkerRefr ...

  7. silverlight visifire控件图表制作——silverlight 后台方法页面事件

    1.返回事件 (1.返回silverlight页面,2.返回web页面) private void button_ClickBack(object sender, RoutedEventArgs e) ...

  8. silverlight visifire控件图表制作——silverlight 后台方法ControlChart.xaml.cs

    一.构造方法ControlChart 1.前台页面控件赋值 //时间下拉框赋值,下拉框赋选定值                for (int ii = DateTime.Today.Year; ii ...

  9. 屏蔽webbrowser控件右键的一种方法

    原文:屏蔽webbrowser控件右键的一种方法 Option ExplicitPrivate Declare Sub ZeroMemory Lib "KERNEL32" Alia ...

随机推荐

  1. Centos 7 安装jdk 配置环境变量

    在Centos7 终端中,我们输入java -version可以看到java的版本,但是输入javac却没有反应 原因是系统中预装的是openjdk jre不是真正的jdk,所以还得自己装好,然后配置 ...

  2. velocity模板引擎学习(3)-异常处理

    按上回继续,前面写过一篇Spring MVC下的异常处理.及Spring MVC下的ajax异常处理,今天看下换成velocity模板引擎后,如何处理异常页面: 一.404错误.500错误 <e ...

  3. SQLServer(MSSQL)、MySQL、SQLite、Access相互迁移转换工具 DB2DB v1.4

    最近公司有一个项目,需要把原来的系统从 MSSQL 升迁到阿里云RDS(MySQL)上面.为便于测试,所以需要把原来系统的所有数据表以及测试数据转换到 MySQL 上面.在百度上找了很多方法,有通过微 ...

  4. Mininet的内部实现原理简介

    原文发表在我的博客主页,转载请注明出处. 前言 之前模拟仿真网络一直用的是Mininet,包括写了一些关于Mininet安装,和真实网络相连接,Mininet简历拓扑的博客,但是大多数都是局限于具体步 ...

  5. js的Object和Function

    自己闲的没事干,自己想通过js的了解写一个Function和Object之间的关系,可以肯定的是我写错了,但是希望可以有所启发. Function和Object Function.__proto__ ...

  6. c#类库和可移值类库的区别

    所谓类库,只能指定一个类库的可运行平台. 而可移值类库,可以在无需修改代码的情况,同时可以在多平台上运行DLL文件.多平台如NET Framework.Silverlight.Windows Phon ...

  7. [HDOJ5439]Aggregated Counting(乱搞)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=5439 题意:按规则构造一个数列a a(1)=1 a(2)=2 a(2)=2 -------> 写两个 ...

  8. Position、Float

    http://www.cnblogs.com/coffeedeveloper/p/3145790.html

  9. clean之后R文件消失

    首先确定你的SDK是新的. 其次接下来检查你的.xml文件,文件名不能大写. 如果xml文件太多 ,那么clean一下你的项目,这时候注意看Console的提示. Console会提示你xml文件错误 ...

  10. canvas三角函数直线运动

    var canvas = document.getElementById("canvas"); var cxt = canvas.getContext("2d" ...