zoukankan      html  css  js  c++  java
  • C#中Invoke的用法(Winform编程)

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

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

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

    在一个WinForm界面上有一个按钮(button1)和一个文本框(textBox1),在button1的点击事件处理程序中创建一个新的线程,并期望在新线程中更改textBox1的值,代码如下:

    程序代码

    /// <summary>

    /// 按钮点击事件处理程序

    /// </summary>

    /// <param name="sender"></param>

    /// <param name="e"></param>

    private void button1_Click(object sender, EventArgs e)

    {

        //创建新线程

        Thread processorThread = null;

        processorThread = new Thread(new ThreadStart(Done));

        processorThread.IsBackground = true;

        processorThread.SetApartmentState(ApartmentState.STA);

        processorThread.Start();

    }

    /// <summary>

    /// 更新textBox1值

    /// </summary>

    private void Done()

    {

        textBox1.Text = "www.mzwu.com";

    }

    运行程序点击按钮后出错,提示:线程间操作无效: 从不是创建控件“textBox1”的线程访问它。下边我们用Invoke解决这一问题:

    程序代码

    /// <summary>

    /// 按钮点击事件处理程序

    /// </summary>

    /// <param name="sender"></param>

    /// <param name="e"></param>

    private void button1_Click(object sender, EventArgs e)

    {

        //创建新线程

        Thread processorThread = null;

        processorThread = new Thread(new ThreadStart(Done));

        processorThread.IsBackground = true;

        processorThread.SetApartmentState(ApartmentState.STA);

        processorThread.Start();

    }

    delegate void WriteInvoke(string msg);

    private void Write(string msg)

    {

        textBox1.Text = msg;

    }

    /// <summary>

    /// 更新textBox1值

    /// </summary>

    private void Done()

    {

        this.Invoke(new WriteInvoke(Write), new object[] { "www.mzwu.com" });

    }

    更新成功!

  • 相关阅读:
    .net core读取appsettings.config中文乱码问题
    vs2017错误:当前页面的脚本发生错误
    VS Code中无法识别npm命令
    Visual Studio报错/plugin.vs.js,行:1074,错误:缺少标识符、字符串或数字
    记录一次在生成数据库服务器上出现The timeout period elapsed prior to completion of the operation or the server is not responding.和Exception has been thrown by the target of an invocation的解决办法
    Java集合框架
    java hash表
    Java Dictionary 类存储键值
    java数据结构 栈stack
    java封装
  • 原文地址:https://www.cnblogs.com/hedongnan/p/3147039.html
Copyright © 2011-2022 走看看