当前位置: 首页 > news >正文

textbox文本框跨线程写入,扩展textobx控件

在Windows Forms中,由于UI控件不是线程安全的,直接跨线程访问和修改UI控件通常会导致不可预测的行为或异常。TextBox 控件同样不能直接从非创建它的线程进行写入。为了安全地在不同线程间更新 TextBox 控件的内容,你可以使用控件的 Invoke 方法或 BeginInvoke 方法来在控件的拥有线程(通常是主UI线程)上执行操作。

以下是一个扩展 TextBox 控件的简单示例,它提供了一个线程安全的方法来更新文本内容:

using System;  
using System.Threading;  
using System.Windows.Forms;  public class SafeTextBox : TextBox  
{  // 委托,用于定义在UI线程上执行的方法签名  public delegate void SafeSetTextCallback(string text);  // 公有方法,用于安全地设置TextBox的Text属性  public void SafeSetText(string text)  {  // 检查调用线程是否是创建控件的线程  if (this.InvokeRequired){// 如果不是,则使用Invoke在正确的线程上执行  //方法1 测试通过1//SafeSetTextCallback d = new SafeSetTextCallback(SafeSetText);//this.Invoke(d, new object[] { text });//方法2  测试通过2//Action<string> dlg = new Action<string>(SafeSetText);//this.Invoke(dlg, text);//方法3  测试通过3this.Invoke(new Action<string>(SafeSetText), text);}else  {  // 如果是,则直接设置Text属性  this.Text = text;  }  }  
}  // 使用示例  
public partial class MainForm : Form  
{  private SafeTextBox safeTextBox;  public MainForm()  {  InitializeComponent();  safeTextBox = new SafeTextBox();  safeTextBox.Dock = DockStyle.Fill;  this.Controls.Add(safeTextBox);  // 在一个后台线程中更新TextBox  Task.Run(() =>  {  // 模拟一些工作  Thread.Sleep(1000);  // 安全地更新TextBox的文本  safeTextBox.SafeSetText("这是从后台线程安全地写入的文本!");  });  }  
}

在上面的代码中,SafeTextBox 类继承自 TextBox 类,并添加了一个名为 SafeSetText 的方法。这个方法接受一个字符串参数,并使用一个委托来在UI线程上安全地设置 TextBox 的 Text 属性。如果调用 SafeSetText 的线程不是创建 TextBox 的线程(即主UI线程),则通过 Invoke 方法在正确的线程上执行该操作。如果是主UI线程,则直接设置 Text 属性。

使用 SafeTextBox 控件与使用普通的 TextBox 控件类似,但是你可以通过调用 SafeSetText 方法来安全地在后台线程中更新其文本内容。

注意:虽然上面的代码示例适用于Windows Forms应用程序,但如果你正在使用WPF或其他类型的UI框架,实现方式可能会有所不同。在WPF中,你通常会使用 Dispatcher.Invoke 或 Dispatcher.BeginInvoke 来在UI线程上执行操作。

特此记录

anlog

2024年2月23日

http://www.lryc.cn/news/305049.html

相关文章:

  • 【踩坑】PyTorch中指定GPU不生效和GPU编号不一致问题
  • 线性代数:向量、张量、矩阵和标量
  • WordPres Bricks Builder 前台RCE漏洞
  • 渗透测试—信息收集
  • 安卓adb调试备忘录
  • 【软件架构】01-架构的概述
  • Vue 图片轮播第三方库 介绍
  • 设置主从复制时发生报错Could not find first log file name in binary log index file‘;解决方案
  • React Context的使用方法
  • ElasticSearch索引数据备份与恢复
  • kubernetes日志收集 fluent-operator 动态索引名的实现
  • pip换源
  • 7.(数据结构)堆
  • AWS Elastic Beanstalk通过应用负载均衡配置https
  • AC自动机:文本搜索的加速器
  • 备战蓝桥杯---基础算法刷题1
  • 探索 Flutter 中的动画:使用 flutter_animate
  • 装机容量对光伏发电量的影响有多大?如何通过装机容量计算发电量?
  • 软考37-上午题-【数据库】-数据模型、数据库的三级模式和二级映像
  • 06 分频器设计
  • 力扣hot100题解(python版7-9题)
  • ECMAScript 6+ 新特性 ( 四 ) 迭代器 与 生成器
  • 【MySQL】事务的一致性究竟怎么理解?
  • 证件照(兼容H5,APP,小程序)
  • pytorch-textregression,中文文本回归实践,支持多值输出
  • go语言学而思【持续更新】
  • LVS-NAT之VMNET环境搭建
  • [TCP] TCP/IP 基础知识词典(2)
  • 【牛牛送书 | 第四期】《高效使用Redis:一书学透数据存储与高可用集群》带你快速学习使用Redis
  • Threejs 实现3D影像地图,Json地图,地图下钻