转载:C# this.invoke()作用 多线程操作UI 理解二

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

 //测试的窗体
public class TestForm : Form
{
    //创建一个Button对象
    private Button button = new Button();
    //构造函数
    public TestForm()
    {
        //设置按钮的属性
        button.Size = new Size(150, 100);   //大小
        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 < 1000)
        {
            //跨线程调用更新窗体上控件的属性,这里是更新这个按钮对象的Text属性
            this.Invoke((EventHandler)delegate
            {
                button.Text = (1000 - Environment.TickCount + tick).ToString() + "微秒后开始更新";
            });
            //做一个延迟,避免太快了,视觉效果不好。
            Thread.Sleep(100);
        }
        //演示,10次数字递增显示
        for (int i = 0; i < 10; i++)
        {
            this.Invoke((EventHandler)delegate
            {
                button.Text = i.ToString();
            });
            Thread.Sleep(200);
        }
        //虽然不是循环内,请不要忘记,你的调用依然在辅助线程中,所以,还是需要invoke的。
        //还原状态,设置按钮的文本为初始状态,设置按钮可用。
        this.Invoke((EventHandler)delegate
        {
            button.Text = "点击开始测试";
            button.Enabled = true;
        });
    }
}  
时间: 2024-10-07 14:04:25

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

多线程操作UI控件——DataGridView假死现象

在多线程编程中,如果你从非创建这个控件的线程中访问这个控件或者操作这个控件的话就会抛出这个异常.这是微软为了保证线程安全以及提高代码的效率所做的改进,但是也 给大家带来很多不便. 今天我就遇到了一个类似的问题,对DataGridView指定 DataSource 来填充数据,更新数据的时候,会导致DataGridView出现假死,显示错误或者滚动条无法显示的问题,在保证了DataGridView的ScrollBars设置为了Both,数据量大于DataGridView显示的的范围,而且没有冻结列

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

1.使用定时器异步修改 这是相对比较简单的方法 在Wpf中定时器使用DiapatcherTimer,不使用Timer原因: 在一个应用程序中,Timer会重复生成time事件,而DispatcherTimer是一个集成到了Dispatcher队列中的时钟,这可以使它被按照指定的时间间隔以指定的priority定期执行. 对于一个Timer时钟事件,系统并不能保证在时间间隔到达后被立即执行,但是能够确保在时间间隔到达之前不被执行.这是因为DispatcherTimer像其他操作一样被放置在了Dis

winform进程间操作UI控件

一,问题说明. 当在主线程之外新建一个线程之后,我们想通过新建线程修改主界面控件的属性等操作,此时,Windows会报错,提示进程间操作UI无效. 二,解决方法. 1,并不高明的做法,有一定作用,并不推荐. public Form1() { InitializeComponent(); CheckForIllegalCrossThreadCalls = false;//这种设置相当于让vs同意这样进程间操作 } 2,利用委托来进行操作.相当于在新建进程和主进程间出现了一个第三方,这个第三方把新建

winform线程间操作UI的五种方法

经常因为需要在线程间操作UI而头疼,总结了一下,记录出来,以后方便查阅. 方法一 通过设置窗体属性,取消线程间的安全检查.(最简单,最省事,也是最不负责任的一种) 1 public partial class one : Form 2 { 3 public one() 4 { 5 InitializeComponent(); 6 Control.CheckForIllegalCrossThreadCalls = false;//取消线程间的安全检查 7 } 8 9 private void Fo

Winform软件,不要在线程里操作UI

对于Winform软件,不要在线程里操作UI,不要相信:StartForm.CheckForIllegalCrossThreadCalls = false; 于是,把所有的代码都改成主线程委托调用的方式 private delegate void SetTextHandle(string id, string value); private void ThreadSetText(string id, string value) { this.Controls.Find(id, true)[0].

黑马程序员-Java多线程操作

--Java培训.Android培训.iOS培训..Net培训.期待与您交流!--- Java中的线程 一个程序的运行需要启动一个应用进程,一个进程可以创建多个线程,帮助应用完成多任务操作,实现并发运行.在Java中线程是被封装成Thread类,进行多线程操作时只需要继承一个Thread类,实现自己的功能即可,然后开启此线程,或者你也可以实现一个Runnable接口,然后将其传递给Thread对象,然后再启动它. 线程的创建于启动 继承Thread 创建一个类并继承Thread类,然后实现Thr

IE exp中的多线程操作

最近在写cve-2014-0321这个漏洞的poc,分析的时候发现这流程简直就是个坑(越写越坑!!),没办法只能照着古河的思路,利用多线程进行操作.虽然知道多线程操作用window.open去创建,但调用了之后发现一直创建的都是个进程,根本就没有线程啊,简直就是个坑啊.后来无数次的尝试之后才发现,之前一直本地进行IE漏洞的调试,这样子使用window.open打开的总是一个进程,这样子也就没办法实现利用或者是占位.之后,用python架了简易的web服务,web的方式来访问,才发现window.

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

一.前言       多线程操作一直是编程的常用操作,掌握好基本的操作可以让程序运行的更加有效.本文不求大而全,只是将我自己工作中常常用到的多线程操作做个分类和总结.平时记性不好的时候还能看看.本文参考了多篇园子里的精彩博文,在文章最后会贴出具体来源,感谢他们的无私奉献. 二.关于线程 (1) 为何使用线程: 可以使用线程将代码同其他代码隔离,提高应用程序的可靠性: 可以使用线程来简化编码: 可以使用线程来实现并发执行. (2) 进程.应用程序域以及线程的关系: 进程(Process)是Wind

Java多线程操作

Java中的线程 一个程序的运行须要启动一个应用进程,一个进程能够创建多个线程.帮助应用完毕多任务操作.实现并发运行.在Java中线程是被封装成Thread类.进行多线程操作时仅仅须要继承一个Thread类,实现自己的功能就可以.然后开启此线程,或者你也能够实现一个Runnable接口.然后将其传递给Thread对象.然后再启动它. 线程的创建于启动 继承Thread 创建一个类并继承Thread类,然后实现Thread类的run方法,在run方法内填上自己的代码.然后创建这个自己定义类,并调用