栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > .Net

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

.Net 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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 + "rn");
        //        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() + "rn";
    }
}

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/910663.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号