• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

简短总结一下C#里跨线程更新UI

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

 

摘自: http://my.oschina.net/sdqxcxh/blog/53707

       跨线程更新UI是写多线程程序尤其是通信类的程序经常遇到的问题,这里面主要的问题是冲突,比如数据线程想要更新UI的时候,用户同时也在更新UI,就会出现争用。C#里可以用

Control.CheckForIllegalCrossThreadCalls = false;

      来关闭跨线程检测。但是这样做有一定的风险,容易让程序崩溃。

      最好的办法是通过Invoke,这篇博客只是提供一个示例,至于那些线程同步、Invoke和BeginInvoke,Invoke底层实现神马的,有空再说吧。

 

      一个简单的例子如下:(注,Form1 加入了一个名为txt的TextBox)

using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using System.Threading;namespace testThread{
    public partial class Form1 : Form
    {
        private delegate void InvokeCallback(string msg); //定义回调函数(代理)格式
        public Form1()
        {
            InitializeComponent();
            Control.CheckForIllegalCrossThreadCalls = false;//关闭跨线程调用检测
            MyMessage m = new MyMessage();//一个消息源
            //启动一个线程,把界面对象传递过去
            Thread t = new Thread(new ParameterizedThreadStart(m.Test));
            t.Start((object)this);
        }
        //Invoke回调函数
        public void UpdateText(string text)
        {
            if (txt.InvokeRequired)//当前线程不是创建线程
                txt.Invoke(new InvokeCallback(UpdateText),new object[]{text});//回调
            else//当前线程是创建线程(界面线程)
                txt.Text = text;//直接更新
        }
    }
    //消息源
    class MyMessage
    {
        public void Test(object para)
        {
            Form1 form = (Form1)para;
            form.UpdateText("测试");
        }
    }
}

      上面的例子很简单,主要是需要判断一下当前线程是不是控件的创建线程,如果是就直接更新,否则建立一个Invoke对象,设置好代理和参数,然后调用Invoke。需要注意的是建立线程的时候如果需要传参数,应该通过ParameterizedThreadStart建立并且以object格式传递参数。


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
C#之内存泄露以及解决方法发布时间:2022-07-10
下一篇:
c#中Split等分割字符串的几种方法(转)发布时间:2022-07-10
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap