首页 > 编程语言 >C#中使用Invoke和BeginInvoke跨线程更新UI控件示例代码

C#中使用Invoke和BeginInvoke跨线程更新UI控件示例代码

时间:2022-09-23 15:59:25浏览次数:91  
标签:控件 Invoke 示例 richTextBox1 BeginInvoke 线程

在多线程开发过程中,有时候需要更新UI控件内容,但是在c#多线程Task、Thread、BackgroundWork中不能直接更新UI控件,否则会报调用线程不能访问此对象,因为它由另一个线程拥有The calling thread cannot access this object because a different thread owns it.异常,这个时候我们就需要用到控件委托 Invoke、 BeginInvoke、 EndInvoke来避免此异常;在winform和wpf多线程操作UI控件都会有这个问题,我们先讲讲winform下如何解决这个问题。

WINFORM

首先我们创建一个winform窗体,点击按钮时循环一万次并更新下方的richTextBox1内容,这个时候我们不加Invoke,运行代码后出现报错线程间操作无效:从不是创建控件“richTextBox1”的线程访问它
多线程更新界面控件界面

多线程更新界面控件报错
这个时候我们加上Invoke委托,问题得到解决,分别贴上InvokeBeginInvoke用法,示例代码如下~

Invoke示例代码

public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Task.Run(() =>
            {
                for (int i = 0; i < 10000; i++)
                {
                   this.Invoke(new MethodInvoker(() =>
                    {
                        richTextBox1.AppendText($"第{i}次循环\r\n");
                    }));
                }
            });
        }
    }

BeginInvoke示例代码

public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Task.Run(() =>
            {
                for (int i = 0; i < 10000; i++)
                {
                    this.richTextBox1.BeginInvoke(new MethodInvoker(() =>
                    {
                        richTextBox1.AppendText($"第{i}次循环\r\n");
                    }));
                }
            });
        }
    }

WPF

在wpf中Invoke的位置和winform稍有不同,wpf Invoke是在控件的Dispatcher对象下,分别贴上InvokeBeginInvoke用法,示例代码如下~

Invoke示例代码

private void button1_Click(object sender, RoutedEventArgs e)
        {
            Task.Run(() =>
            {
                for (int i = 0; i < 10000; i++)
                {
                    this.richTextBox1.Dispatcher.Invoke((Action)delegate
                    {
                        richTextBox1.AppendText($"第{i}次循环\r\n");
                    });
                }
            });
        }

BeginInvoke示例代码

private void button1_Click(object sender, RoutedEventArgs e)
        {
            Task.Run(() =>
            {
                for (int i = 0; i < 10000; i++)
                {
                    this.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Normal, (Action)delegate
                    {
                        richTextBox1.AppendText($"第{i}次循环\r\n");
                    });
                }
            });
        }

转载自:C#中使用Invoke和BeginInvoke跨线程更新UI控件示例代码

标签:控件,Invoke,示例,richTextBox1,BeginInvoke,线程
From: https://www.cnblogs.com/zxqqqq/p/16722980.html

相关文章

  • ReentrantReadWriteLock 使用示例
    ReadWriteLock使用示例1.使用场景前两天同事发给我一个工具类,封装了调用第三方接口的方法。第三方接口调用需要带上访问凭据accessToken,需要先调用login接口传入usern......
  • Winform控件
    1、WinForm布局属性(控件与布局相关的属性,设计界面可见)(1)Anchor:固定、锚定(无论窗口怎么变化,控件的相对位置都不变)        -含义:固定控件与父窗口的【上下左右边距】......
  • qt的基本控件——按钮控件
    按钮控件一、button控件(按钮控件)1、button通过setText设置文字//在类中定义一个boolisDown;构造中初始化为false,拖入一个button,直接修改名字为连接设备,转到槽写上如......
  • QT 子控件 键盘事件及键盘事件无法响应
    解决办法:重新的子控件构造函数中加入:setFocusPolicy(Qt::StrongFocus);遇事多看帮助文档,Qt的帮助文档是写的最好的。帮助文档中描述如下:  setFocusPolicy()解释......
  • 使用界面控件Telerik WinForms——轻松搞定工作流程可视化!
    TelerikUIforWinForms拥有适用WindowsForms的110多个令人惊叹的UI控件。所有的UIforWinForms控件都具有完整的主题支持,可以轻松地帮助开发人员在桌面和平板电脑应用......
  • cesium教程7-官方示例模型要素选择翻译
     源代码示例:<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>天地图</title><!--引用cesium的js和css,天地图的扩展js--><!--<s......
  • dotnet 读 WPF 源代码笔记 为什么自定义的 UserControl 用户控件不能跨程序集继承
    从设计上,用户控件UserControl就不是一个合适用来多次继承的类型,更不要说进行跨程序集继承自定义的UserControl用户控件。对于大部分的用户控件来说,都是采用组合现有的......
  • WPF 用户控件,无法使用中文
    一、打开VS的高级保存选项1、工具——自定义——命令——菜单栏,下拉,选择文件。2、点击添加命令,左边类别,选择文件;右边命令,选择高级保存选项;确定。3、可以点击上移,下......
  • Python 使用requests下载图片的方法及示例代码
    Python中可以使用requests模块执行GET和POST请求,requests继承了urllib2的所有特性。requests支持HTTP连接保持和连接池,支持使用cookie保持会话,支持文件上传,支持自动确定响......
  • 路由聚合示例
    原理不作介绍,前置掌握,仅示例常规题:212.56.132.0/24212.56.133.0/24212.56.134.0/24212.56.135.0/24流程:212.56.1000......