C#线程间操作无效:从不是创建控件“textbox1”的线程访问它

news2024/11/29 8:57:14

  在C#的多线程访问中,在线程间的相互访问时因为线程安全问题有访问限制,在创建一般线程时,对于界面元素访问时这样的问题比较常见。

  比如,创建一个form1,上面放置一个textbox控件,创建一个线程去访问textbox,界面如下:

  按钮buuton1的代码:

        private void button1_Click(object sender, EventArgs e)
        {
            var thread1 = new System.Threading.Thread(Func1);
            thread1.Start();
        }

  就是简单地创建一个线程,线程里面运行的func1代码:

        private void Func1()
        {
            for(int i = 0; i < 5; i++)
            {
                textBox1.Text = textBox1.Text+ $"线程{Thread.CurrentThread.ManagedThreadId}执行{i}."+Environment.NewLine;
            }
        }

  运行,点击button1按钮系统会报错:

  意思是说:线程间操作无效:从不是创建控件“textbox1”的线程访问它,这是不允许的。

  线程存在安全保护机制,并不能随意访问,因为这样存在冲突的可能。

  解决这个问题,最直接的方法是在界面初始化后去掉控件的跨线程非法访问属性,即将Control.CheckForIllegalCrossThreadCalls属性设置为false即可。

        public Form1()
        {
            InitializeComponent();
            Control.CheckForIllegalCrossThreadCalls = false;
        }

  这样结果就出来了。

  一般情况下,还是不要设置Control.CheckForIllegalCrossThreadCalls的属性,那么怎样可以达到修改textbox1的值呢?

  可以通过委托来解决。

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

        private void button1_Click(object sender, EventArgs e)
        {
            var thread1 = new System.Threading.Thread(Func1);
            thread1.Start();
        }

        public void SetText(string SText)
        {
            textBox1.Text = textBox1.Text + SText + Environment.NewLine;
        }

        private void Func1()
        {
            string Str = "";
            for (int i = 0; i < 5; i++)
            {
                Str= $"线程{Thread.CurrentThread.ManagedThreadId}执行{i}."+Environment.NewLine;
                if (textBox1.InvokeRequired)
                {
                    Action SetText111 = delegate { SetText(Str); };
                    textBox1.Invoke(SetText111);
                }
                else
                {
                    textBox1.Text = Str;
                }
            }
        }
    }

  这样也可以达到目的,或者直接写更简单:

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

        private void button1_Click(object sender, EventArgs e)
        {
            var thread1 = new System.Threading.Thread(Func2);
            thread1.Start();
        }

        private void Func2()
        {
            textBox1.Invoke(() =>
            {
                for (int i = 0; i < 5; i++)
                {
                    textBox1.Text = textBox1.Text+ $"线程{Thread.CurrentThread.ManagedThreadId}执行{i}." + Environment.NewLine;
                }
            });
        }

    }

  效果也是一样的。

  在C#中,需要注意Invoke和begininvoke的区别。

  control.invoke(参数delegate):在拥有此控件的基础窗口句柄的线程上执行指定的委托,注意是同步。
  control.begininvoke(参数delegate):在创建控件的基础句柄所在线程上异步执行指定委托,注意这里执行的是异步。

  在跨线程请求时,常检验textBox1.InvokeRequired属性,即是否跨线程请求。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/41550.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

3_SpringMVC_执行流程

1DispatcherServlet&#xff1a;前端控制器 用户请求到达前端控制器&#xff0c;它就相当于 mvc 模式中的 c&#xff0c;dispatcherServlet 是整个流程控制的中心&#xff0c;由 它调用其它组件处理用户的请求&#xff0c;dispatcherServlet 的存在降低了组件之间的耦合性。 2…

【学习笔记43】JavaScript的事件

JavaScript的事件一、JS的事件1、事件的三要素2、DOM 0级事件绑定3、DOM 2级事件绑定(事件监听)二、浏览器事件三、鼠标事件1. 左键单击&#xff1a;click2. 双击事件&#xff1a;dblclick3.右键事件&#xff1a;contextmenu4. 鼠标按下事件&#xff1a;mousedown5. 鼠标抬起事…

编写Servlet代码获取页面body中json数据

目录 1、在 maven 项目中引入 jackson 2、编写代码 ① 介绍 jackson 提供操作 json 数据的类和方法 ② 确定 json 数据格式&#xff0c;并写出对应的类 ③ 编写servlet代码 3、使用 postman 发送数据观察结果 4、拓展 readValue 方法返回构造对象的过程 本文使用maven项目&…

HTML5详解

文章目录1 网页基本标签1.2 标题标签1.3 段落标签1.4 换行标签1.5 水平线标签1.6 字体样式标签1.7 注释和特殊符号2 图像、超链接、网页布局2.1 图像2.2 超链接标签2.3 块元素和行内元素2.4 网页布局3 列表、表格、媒体元素、iframe内联框架3.1 列表3.2 表格3.3 媒体元素3.4 if…

Unity 之 安卓堆栈跟踪和日志工具 (Android Logcat | 符号表解析Bugly捕获)

Unity 之 日志解析工具 Android Logcat一&#xff0c;工具集成1.1 注意事项1.2 导入插件二&#xff0c;连接设备2.1 使用USB连接2.2 无线连接三&#xff0c;实用功能介绍3.1 通用介绍3.2 堆栈跟踪工具 -- 解析Bugly捕获报错一&#xff0c;工具集成 Logcat是开发者必备的工具&a…

ps,查看Linux系统进程信息小帮手-尚文网络xUP楠哥

~~全文共852字&#xff0c;阅读需约5分钟。 进Q群11372462&#xff0c;领取专属报名福利&#xff0c;包含云计算学习路线图代表性实战训练大厂云计算面试题资料! ps命令在Linux系统中非常的常用&#xff0c;主要是帮助我们查看系统进程的详细信息&#xff0c;其中&#xff0c;…

Jetson Nano如何安装 onnxruntime gpu Python包

Jetson Nano 可以直接 pip 安装 cpu 版本的 onnxruntime 用 pypi 的源&#xff0c;直接安装 onnxruntime-gpu 或者 onnxruntime_gpu 都会报找不到对应的架构 aarch64 本来以为要用官方库编译一下 https://github.com/microsoft/onnxruntime 幸运的是&#xff0c;NVIDIA官方帮…

地级市市场化指数+樊纲市场化指数(包含分省、市两份数据)

一、地级市市场化指数 1、数据来源&#xff1a;各省份年鉴以及地级市统计公报 2、时间跨度&#xff1a;1998-2020年 3、区域范围&#xff1a;422&#xff08;城市和区&#xff09; 4、指标说明&#xff1a; 依据樊纲市场化各指标&#xff0c;结合各地级市的相关数据算出来…

Typecho中handsome主题如何增加侧边导航栏

&#x1f482;作者简介&#xff1a; THUNDER王&#xff0c;一名热爱财税和SAP ABAP编程以及热爱分享的博主。目前于江西师范大学会计学专业大二本科在读&#xff0c;同时任汉硕云&#xff08;广东&#xff09;科技有限公司ABAP开发顾问。在学习工作中&#xff0c;我通常使用偏后…

【心电信号】小波阙值心电信号去噪【含Matlab源码 2188期】

⛄一、小波阈值法去噪概述 电能质量扰动信号的噪声大多以高斯白噪声的形式存在&#xff0c;利用小波变换对信号进行多分辨率分解&#xff0c;由于小波变换具有去除数据相关性的特点&#xff0c;故可以将有用信号与噪声的能量分离开来。信号中有效的信息主要集中在较大的小波系…

【Vue】Vuex-store

Vuex是什么&#xff1f; Vuex是实现组件全局状态(数据&#xff09;管理的一种机制&#xff0c;可以方便的实现组件之间数据的共享。 像一个仓库一样&#xff01; 使用Vuex统一管理状态的好处&#xff1f; 1.能够在vuex中集中管理共享的数据&#xff0c;易于开发和后期维护 2.能…

二叉查找树(1)-二叉树-数据结构和算法(Java)

文章目录1 前言1.1 二叉查找树定义1.2 二叉查找树的性质2 基本实现2.1 API2.2 实现代码2.2.1 数据表示2.2.2 查找2.2.3 插入3 分析4 有序性相关方法与删除操作4.1 最大键和最小键4.2 向上取整和向下取整4.2.1 向下取整floor()4.2.2 向上取整ceiling()4.3 选择select()4.4 排名r…

微服务框架 SpringCloud微服务架构 3 Eureka 3.1 提供者与消费者

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式&#xff0c;系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 SpringCloud微服务架构 文章目录微服务框架SpringCloud微服务架构3 Eureka3.1 提供者与消费者3.1.1 一些概念3.1.2 一个问题3.1.3 总结3 Eur…

【Hack The Box】linux练习-- Pit

HTB 学习笔记 【Hack The Box】linux练习-- Pit &#x1f525;系列专栏&#xff1a;Hack The Box &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f4c6;首发时间&#xff1a;&#x1f334;2022年11月27日&#x1f334; &#x1f36d;…

单片机如何控制外设?

单片机如何控制外设&#xff1f; 单片机不是直接控制外设的&#xff0c;而是通过配置片上外设寄存器来控制其输出和检测高低电平&#xff0c;进而控制外围器件。 单片机如何配置寄存器的&#xff1f; 下图是单片机驱动 点亮发光二极管 内核从flash里面加载读取指令。内核根据指…

将DataFrame中符合指定条件的数据替换为指定的值:mask()函数

【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 将DataFrame中符合指定条件的数据 替换为指定的值&#xff1a;mask()函数 选择题 下列说法错误的是? import pandas as pd myDF pd.DataFrame({"A":[1,2,3], "B":[4,…

java EE初阶 — 如何进行多线程编程

文章目录1.java如何进行多线程编程1.1 最基础的多线程代码1.2 线程的优势2.java中创建线程的方法2.1 继承Thread 重写run2.2 实现Runnable 接口2.3 使用匿名的内部类&#xff0c;继承 Thread2.4 使用匿名类。继承 Runnable2.5 使用 Lambda 表达式&#xff08;最简答、最推荐&am…

2000-2020年迪博上市公司内部控制指数

2000-2020年迪博上市公司内部控制指数 1、时间&#xff1a;2000-2020年 2、指标包括&#xff1a; 证券代码、证券简称、辖区、证监会行业、申万行业、内部控制指数、报告期 3、指标解释&#xff1a; 上市公司内部控制指数是结合国内上市公司实施内部控制体系的现状&#x…

java——电商购物平台

1.java编译环境的创建&#xff0c;与所需要用到的插件 (1) 选择的编译器为2022版本的intellij idea 首先新建一个空项目 同时,创建完之后,我们点击 文件 -> 项目结构 进入项目结构,点击项目,选择好你想要的jdk版本,若没有,可以在idea中下载,这里我使用openjdk-19, 点击模…

Python适合0基础菜鸟学吗

前言 经常有小伙伴问&#xff1a;Python适合0基础初学编程的人学吗&#xff1f;今天我们就来从Python的功能和特性方面看一下&#xff0c;Python是否能让新人快速上手。 1、非常适合。我觉得刚开始学编程&#xff0c;负担越少越好&#xff0c;应该尽快能做出东西来。刚开始学…