Invoke()的作用是:在应用程序的主线程上执行指定的委托。一般应用:在辅助线程中修改UI线程( 主线程 )中对象的属性时,调用this.Invoke();

 //测试的窗体
public class TestForm : Form
{
//创建一个Button对象
private Button button = new Button();
//构造函数
public TestForm()
{
//设置按钮的属性
button.Size = new Size(, ); //大小
button.Click += Button1_Clicked; //注册事件
button.Text = "点击开始测试"; //设置显示文本
this.Controls.Add(button); //添加到窗体上
this.Text = "多线程范例"; //设置窗体的标题栏文本
}
//按钮的Click事件响应方法
public void Button1_Clicked(object sender, EventArgs e)
{
//启动一个线程
new Thread(ThreadProc).Start();
}
//线程函数
public void ThreadProc()
{
//this.Invoke就是跨线程访问ui的方法,也是本文的范例
//首先invoke一个匿名委托,将button对象禁用
this.Invoke((EventHandler)delegate
{
button.Enabled = false;
}); //记录一个时间戳,以演示倒计时效果
int tick = Environment.TickCount;
while (Environment.TickCount - tick < )
{
//跨线程调用更新窗体上控件的属性,这里是更新这个按钮对象的Text属性
this.Invoke((EventHandler)delegate
{
button.Text = ( - Environment.TickCount + tick).ToString() + "微秒后开始更新";
});
//做一个延迟,避免太快了,视觉效果不好。
Thread.Sleep();
}
//演示,10次数字递增显示
for (int i = ; i < ; i++)
{
this.Invoke((EventHandler)delegate
{
button.Text = i.ToString();
});
Thread.Sleep();
}
//虽然不是循环内,请不要忘记,你的调用依然在辅助线程中,所以,还是需要invoke的。
//还原状态,设置按钮的文本为初始状态,设置按钮可用。
this.Invoke((EventHandler)delegate
{
button.Text = "点击开始测试";
button.Enabled = true;
});
}
}

转载:C# this.invoke()作用 多线程操作UI 理解二的更多相关文章

  1. C# this.invoke()作用 多线程操作UI

    Invoke()的作用是:在应用程序的主线程上执行指定的委托.一般应用:在辅助线程中修改UI线程( 主线程 )中对象的属性时,调用this.Invoke(); //测试的窗体 public class ...

  2. 多线程系列之 java多线程的个人理解(二)

    前言:上一篇多线程系列之 java多线程的个人理解(一) 讲到了线程.进程.多线程的基本概念,以及多线程在java中的基本实现方式,本篇主要接着上一篇继续讲述多线程在实际项目中的应用以及遇到的诸多问题 ...

  3. 多线程操作UI界面的示例 - 更新进度条

    http://blog.csdn.net/liang19890820/article/details/52186626

  4. C# Wpf异步修改UI,多线程修改UI(二)

    1.使用定时器异步修改 这是相对比较简单的方法 在Wpf中定时器使用DiapatcherTimer,不使用Timer原因: 在一个应用程序中,Timer会重复生成time事件,而DispatcherT ...

  5. 多线程中操作UI

    遇到过要在工作线程中去更新UI以让用户知道进度,而在多线程中直接调用UI控件操作是错误的做法. 最后解决方法是将操作UI的代码封装,通过Invoke / BeginInvoke 去委托调用. 代码封装 ...

  6. 多线程与UI操作(二)

    为了让程序尽快响应用户操作,在开发Windows应用程序时经常会使用到线程.对于耗时的操作如果不使用线程将会是UI界面长时间处于停滞状态,这种情况是用户非常不愿意看到的,在这种情况下我们希望使用线程来 ...

  7. C#多线程操作界面控件的解决方案(转)

    C#中利用委托实现多线程跨线程操作 - 张小鱼 2010-10-22 08:38 在使用VS2005的时候,如果你从非创建这个控件的线程中访问这个控件或者操作这个控件的话就会抛出这个异常.这是微软为了 ...

  8. 拒绝卡顿——在WPF中使用多线程更新UI

    原文:拒绝卡顿--在WPF中使用多线程更新UI 有经验的程序员们都知道:不能在UI线程上进行耗时操作,那样会造成界面卡顿,如下就是一个简单的示例: public partial class MainW ...

  9. C#中级-常用多线程操作(持续更新)

    一.前言       多线程操作一直是编程的常用操作,掌握好基本的操作可以让程序运行的更加有效.本文不求大而全,只是将我自己工作中常常用到的多线程操作做个分类和总结.平时记性不好的时候还能看看.本文参 ...

随机推荐

  1. B树算法与实现 (C语言实现)

    B树的定义 假设B树的度为t(t>=2),则B树满足如下要求:(参考算法导论) (1)  每个非根节点至少包含t-1个关键字,t个指向子节点的指针:至多包含2t-1个关键字,2t个指向子女的指针 ...

  2. Creating a Table View Programmatically

    https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/TableView_iPhone/Cre ...

  3. 第一篇:SOUI是什么?

    概述 用C++做产品最痛苦的是什么?肯定是做UI. SOUI的使命就是把痛苦的UI变化成快乐的UI. 什么?UI还能快乐?脑子进水了吗? 当你看完这个系统教程的时候相信你面对UI至少不会再痛苦.你可以 ...

  4. dwz的form表单中url的变量替换

    form表单中action的地址格式 “__URL__/edit/{xxx}”,大括号内的 “xxx” 就是变量名,主要功能是结合table组件一起使用. 下图中的删除.编辑.修改密码都是用了url变 ...

  5. LayoutInflater(二)

    每一个视图的绘制过程都必须经历三个最主要的阶段,即onMeasure().onLayout()和onDraw(),下面我们逐个对这三个阶段展开进行探讨. 一. onMeasure() measure是 ...

  6. Jmeter 小攻略(转)

    http://www.myexception.cn/open-source/1346307.html

  7. java运行jar命令提示没有主清单属性

    转自:http://jingyan.baidu.com/article/db55b60990f6084ba30a2fb8.html 可运行的jar:http://mushiqianmeng.blog. ...

  8. hive脚本出现Error: java.lang.RuntimeException: Error in configuring object和Caused by: java.lang.IndexOutOfBoundsException: Index: 9, Size: 9

    是在reduce阶段报的错误,详细错误信息是 朱传豪 19:04:48 Diagnostic Messages for this Task: Error: java.lang.RuntimeExcep ...

  9. HTML轉PDF - 使用Pechkin套件

    剛好跟人討論到HTML轉PDF需求,便對工具進行簡單評估以備不時之需. 網路上比較多人推的是WkHtmlToPdf,如果是用.NET開發,已經有人包成NuGet套件,直接搜尋pechkin就可找到,它 ...

  10. caffe中添加local层

    下载caffe-local,解压缩; 修改makefile.config:我是将cuudn注释掉,去掉cpu_only的注释; make all make test(其中local_test出错,将文 ...