textbox跨线程写入

实现实例1

实现效果

跨线程实现


        // 委托,用于定义在UI线程上执行的方法签名  
        //public delegate void SetTextCallback(string text);
        public void textBoxText(string text)
        {
            // 检查调用线程是否是创建控件的线程  
            if (textBox1.InvokeRequired)
            {
                // 如果不是,则使用Invoke在正确的线程上执行  
                //方法1 测试通过1
                //SetTextCallback d = new SetTextCallback(textBoxText);
                //textBox1.Invoke(d, new object[] { text });
                //方法2  测试通过2
                //Action<string> dlg = new Action<string>(textBoxText);
                //textBox1.Invoke(dlg, text);
                //方法3  测试通过3
                textBox1.Invoke(new Action<string>(textBoxText), text);
            }
            else
            {
                // 如果是,则直接设置Text属性  
                textBox1.Text = text;
            }
        }

 调用跨线程

 private void button1_Click(object sender, EventArgs e)
 {
     // 在一个后台线程中更新TextBox  
     Task.Run(() =>
     {
         while (true)
         {
             // 模拟一些工作  
             Thread.Sleep(100);

             // 安全地更新TextBox的文本  
             
             textBoxText( DateTime.Now.ToString("HH:mm:ss:fff") + " 后台赋值2");
         }
         
         
     });

 }

实现实例2

在Windows Forms应用程序中,跨线程写入TextBox控件通常是不安全的,因为它违反了UI控件的线程亲和性规则。UI控件只能由创建它们的线程(通常是主UI线程)访问和修改。如果尝试从其他线程直接修改TextBoxText属性,可能会遇到不可预测的行为,如异常、界面冻结或数据不一致。

为了确保线程安全地更新TextBox控件的内容,你应该使用控件的InvokeBeginInvoke方法,这些方法允许你在控件的拥有线程上执行委托。Invoke方法是同步的,它会等待操作完成,而BeginInvoke是异步的,不会等待。

以下是一个简单的示例,展示了如何安全地从另一个线程更新TextBox控件的文本:

参考代码

using System;  
using System.Threading;  
using System.Windows.Forms;  
  
public partial class MainForm : Form  
{  
    private TextBox textBox;  
  
    public MainForm()  
    {  
        InitializeComponent();  
        textBox = new TextBox();  
        textBox.Dock = DockStyle.Fill;  
        this.Controls.Add(textBox);  
  
        // 启动一个后台线程来更新TextBox  
        Thread newThread = new Thread(() =>  
        {  
            // 模拟一些工作  
            Thread.Sleep(1000);  
  
            // 安全地更新TextBox的文本  
            UpdateTextBoxFromAnotherThread("这是从另一个线程安全地写入的文本!");  
        });  
  
        newThread.Start();  
    }  
  
    // 使用Invoke确保在UI线程上更新TextBox  
    private void UpdateTextBoxFromAnotherThread(string text)  
    {  
        // 检查是否需要跨线程调用  
        if (textBox.InvokeRequired)  
        {  
            textBox.Invoke(new MethodInvoker(delegate  
            {  
                textBox.Text = text;  
            }));  
        }  
        else  
        {  
            textBox.Text = text;  
        }  
    }  
}

在上面的代码中,UpdateTextBoxFromAnotherThread方法负责更新TextBox的文本。它首先检查是否需要跨线程调用,如果是,则使用Invoke方法来在UI线程上执行一个匿名委托,该委托设置TextBoxText属性。如果不需要跨线程调用(即代码已经在UI线程上执行),则直接更新TextBox的文本。

请注意,这种方法也适用于其他UI控件,如LabelComboBoxListBox等。只需将TextBox替换为相应的控件名称,并相应地调整代码即可。

参考链接

textbox文本框跨线程写入,扩展textobx控件-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/anlog/article/details/136256340?spm=1001.2014.3001.5502

特此记录

anlog

2024年2月27日

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2.12冯诺依曼体系,各功能部件作用,简要工作流程

1)计算机由哪几部分组成&#xff1f;以哪部分为中心&#xff1f;2)主频高的CPU一定比主频低的CPU快吗&#xff1f;为什么&#xff1f;3)翻译程序、汇编程序、编译程序、解释程序有什么差别&#xff1f;各自的特性是什么&#xff1f;4)不同级别的语言编写的程序有什么区别&#…

华为OD技术面试案例3-2024年

技术一面&#xff1a; 1.手撕代码&#xff0c;算法题&#xff1a; 【最小路径和】 手撕代码通过&#xff0c;面试官拍了照片 2.深挖项目&#xff0c;做过的自认为最好的一个项目&#xff0c;描述做过的项目的工作过程&#xff0c;使用到哪些技术&#xff1f; 技术二面&…

单细胞Seurat - 细胞聚类(3)

本系列持续更新Seurat单细胞分析教程&#xff0c;欢迎关注&#xff01; 维度确定 为了克服 scRNA-seq 数据的任何单个特征中广泛的技术噪音&#xff0c;Seurat 根据 PCA 分数对细胞进行聚类&#xff0c;每个 PC 本质上代表一个“元特征”&#xff0c;它结合了相关特征集的信息。…

枚举(蓝桥练习)

目录 一、枚举算法介绍 二、解空间的类型 三、循环枚举解空间 四、例题 &#xff08;一、反倍数&#xff09; &#xff08;二、特别数的和&#xff09; &#xff08;三、找到最多的数&#xff09; &#xff08;四、小蓝的漆房&#xff09; &#xff08;五、小蓝和小桥的…

【JGit 】一个完整的使用案例

需求 生成一系列结构相同的项目代码&#xff0c;将这些项目的代码推送至一个指定的 Git 仓库&#xff0c;每个项目独占一个分支。 推送时若仓库不存在&#xff0c;则自动创建仓库。 分析 生成代码使用 Java 程序模拟&#xff0c;每个项目中模拟三个文件。Project.cpp 、Pro…

CUMT---图像处理与视觉感知---期末复习重点

文章目录 一、概述 本篇文章会随课程的进行持续更新中&#xff01; 一、概述 1. 图像的概念及分类。  图像是用各种观测系统以不同形式和手段观测客观世界而获得的、可以直接或间接作用于人的视觉系统而产生的视知觉实体。  图像分为模拟图像和数字图像&#xff1a;(1) 模拟图…

Leetcode 第 385 场周赛题解

Leetcode 第 385 场周赛题解 Leetcode 第 385 场周赛题解题目1&#xff1a;3042. 统计前后缀下标对 I思路代码复杂度分析 题目2&#xff1a;3043. 最长公共前缀的长度思路代码复杂度分析 题目3&#xff1a;3044. 出现频率最高的质数思路代码复杂度分析 题目4&#xff1a;3045. …

【新书推荐】8.4 逻辑运算指令

本节内容&#xff1a;逻辑运算指令。8086 CPU逻辑运算指令包括NOT、AND、OR、XOR&#xff0c;除NOT指令外&#xff0c;均有两个操作数。逻辑运算指令影响状态标志位。 ■否操作指令NOT指令格式&#xff1a;NOT OPRD。将OPRD取反&#xff0c;然后送回OPRD。操作数可以是8位/16位…

Jetson系统烧录环境搭建

一 序言 Jetson 系列产品烧录系统的方法一般有两种&#xff0c;一种为使用 NVIDIA 官方提供 的 SDK manager 软件给 Jetson 设备烧录系统&#xff08;请查看说明文档《Jetson 产品使用 SDKmanager 烧录系统》&#xff09;。另一种即为当前文档所描述的&#xff0c;在安装 Ubun…

GZ036 区块链技术应用赛项赛题第10套

2023年全国职业院校技能大赛 高职组 “区块链技术应用” 赛项赛卷&#xff08;10卷&#xff09; 任 务 书 参赛队编号&#xff1a; 背景描述 养老保险是对于老年人的最基本的生活保障。各种数据显示&#xff0c;当前的养老金市场规模庞大。2016年美国的养老金资…

403页面绕过

403页面绕过 文章目录 403页面绕过姿势一: 端口利用姿势二&#xff1a;修改HOST姿势三&#xff1a;覆盖请求URL姿势四&#xff1a;Referer标头绕过姿势五&#xff1a;代理IP姿势六&#xff1a;扩展名绕过 姿势一: 端口利用 拿到客户给的地址后&#xff0c;首先进行信息收集。端…

MySQL存储引擎及索引机制

MySQL技术——存储引擎和索引机制 一、存储引擎概述二、常见存储引擎的区别三、索引机制四、索引的底层实现原理五、InnoDB主键和二级索引六、聚集索引和非聚集索引七、哈希索引八、InnoDB的自适应哈希索引九、索引常见问题十、慢查询日志总结 一、存储引擎概述 插件式存储引擎…

【C++私房菜】序列式容器的迭代器失效问题

目录 一、list的迭代器失效 二、vector的迭代器失效 1、空间缩小操作 2、空间扩大操作 三、总结 在C中&#xff0c;当对容器进行插入或删除操作时&#xff0c;可能会导致迭代器失效的问题。所谓迭代器失效指的是&#xff0c;原先指向容器中某个元素的迭代器&#xff0c;在…

IDEA基础——Maven配置tomcat

配置方案 一、配置maven-tomcat plugin插件&#xff08;只最高支持到tomcat 8&#xff09;~~1.添加镜像源&#xff0c;获取tomcat 8插件配置~~~~1.1 在pom.xml里先添加镜像源~~~~1.2 添加tomcat插件配置~~ 2. 添加tomact官方发布的插件配置&#xff08;无需添加镜像源&#xff…

回溯算法,你“回”了吗

目录 一、什么是回溯算法 二、应用场景 三、一般解题步骤 1、确定回溯方法以及参数 2、确定回溯的终止条件 3、确定搜索过程 四、力扣例题 1、题目描述 2、解题思路 3、代码示例 五、总结 一、什么是回溯算法 回溯算法&#xff0c;又称为试探法&#xff0c;是一种…

用友 NC 23处接口XML实体注入漏洞复现

0x01 产品简介 用友 NC 是用友网络科技股份有限公司开发的一款大型企业数字化平台。 0x02 漏洞概述 用友 NC 多处接口存在XML实体注入漏洞,未经身份验证攻击者可通过该漏洞读取系统重要文件(如数据库配置文件、系统配置文件)、数据库配置文件等等,导致网站处于极度不安全…

【Redis】深入理解 Redis 常用数据类型源码及底层实现(5.详解List数据结构)

本文是深入理解 Redis 常用数据类型源码及底层实现系列的第5篇&#xff5e;前4篇可移步(&#xffe3;∇&#xffe3;)/ 【Redis】深入理解 Redis 常用数据类型源码及底层实现&#xff08;1.结构与源码概述&#xff09;-CSDN博客 【Redis】深入理解 Redis 常用数据类型源码及底…

Ubuntu22.04.3LTS源码编译安装ffmpeg6.x

1.官网ffmpeg下载源码 https://ffmpeg.org/download.html#build-windows 安装 libx264 开发库&#xff08;一个开源的视频压缩库&#xff0c;用于编码视频流为 H.264/MPEG-4 AVC 视频格式&#xff09;。这是编译 FFmpeg 时如果要支持 H.264 编码必须的。 sudo apt install l…

Liunx前后端项目部署(小白也可安装)

文章目录 一、CentOS服务器的安装二、jdk安装三、Tomcat安装四、MySQL安装、五、nginX安装六、多个项目负载均衡&#xff0c;部署后端项目七、前端项目部署 一、CentOS服务器的安装 选择liunx&#xff0c;下面选择CentOS 7 ![在这里插入图片描述](https://img-blog.csdnimg.cn…

预训练概念

预训练是指在特定任务之前&#xff0c;在大规模数据集上对神经网络进行训练以学习通用的表示形式或特征。这些通用表示可以捕捉数据中的统计结构和语义信息&#xff0c;使得神经网络能够更好地理解和处理输入数据。 在大规模预训练模型中&#xff0c;通常会使用无监督或弱监督的…