textbox跨线程写入

本文详细介绍了在WindowsForms应用程序中如何使用跨线程技术,尤其是Invoke和BeginInvoke方法,确保安全地更新TextBox控件的文本,避免界面异常和数据不一致性。
摘要由CSDN通过智能技术生成

实现实例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日

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值