.NET WinForm跨线程访问控件三种方式

本文介绍了如何在C# WinForms中使用BackgroundWorker和Task实现异步操作,通过实例展示了如何在Form1中处理线程安全地更新UI控件。方法2详细介绍了BackgroundWorker的使用,而方法3则演示了Task的无限循环应用。
摘要由CSDN通过智能技术生成
public partial class Form1 : Form
{
    int index = 0;
    public Form1()
    {
        // 方法1
        //System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;
        InitializeComponent();
    }
    private void button1_Click(object sender, EventArgs e)
    {
        // 方法2
        //using (BackgroundWorker bw = new BackgroundWorker())
        //{
        //    bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
        //    bw.DoWork += new DoWorkEventHandler(bw_DoWork);
        //    bw.RunWorkerAsync("Tank");
        //}

        // 方法3
        //Task.Run(() =>
        //{
        //    while (true)
        //    {
        //        index++;
        //        SetAppendTB(this.textBox1, index + "\r\n");
        //        Thread.Sleep(100);
        //    }
        //});
    }

    public delegate void SetText(Control tb, string str);
    private void SetAppendTB(Control tb, string str)
    {
        if (tb.InvokeRequired)//判断是不是跨线程 true是 false不是
        {
            SetText setText = new SetText(SetAppendTB);//实例化委托对象
            Invoke(setText, new object[] { tb, str });//线程传递
        }
        else
        {
            tb.Text = str;//赋值操作 可自行替换
        }
    }

    void bw_DoWork(object sender, DoWorkEventArgs e)
    {
        // 这里是后台线程, 是在另一个线程上完成的
        // 这里是真正做事的工作线程
        // 可以在这里做一些费时的,复杂的操作
        Thread.Sleep(5000);
        e.Result = e.Argument + "工作线程完成";
    }

    void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        //这时后台线程已经完成,并返回了主线程,所以可以直接使用UI控件了
        this.textBox1.Text = e.Result.ToString() + "\r\n";
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值