博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
简短总结一下C#里跨线程更新UI
阅读量:4677 次
发布时间:2019-06-09

本文共 1682 字,大约阅读时间需要 5 分钟。

 

摘自: 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格式传递参数。

posted on
2014-10-16 14:30  阅读(
...) 评论(
...) 收藏

转载于:https://www.cnblogs.com/wuyifu/p/4028729.html

你可能感兴趣的文章
git + git flow 的简单介绍
查看>>
如果我们想要交换两个数字,就可以使用位运算
查看>>
求给出第 K个 N位二进制数,该二进制数不得有相邻的“1”
查看>>
P1059 明明的随机数【去重排序】
查看>>
HDU 1060 Leftmost Digit【log10/求N^N的最高位数字是多少】
查看>>
tomcat配置文件web.xml与server.xml解析--重要
查看>>
【C语言】《C Primer Plus》递归:以二进制形式输出整数
查看>>
使用框架的——好处
查看>>
如此大量的代码,但每个类里面的代码却不显得特别多,原因。。。。。。。。。。。。...
查看>>
C#特征备忘
查看>>
Java 面向对象 之 final 关键字
查看>>
Contact Form 7邮件发送失败的解决办法
查看>>
P1800 software_NOI导刊2010提高(06)
查看>>
Python学习日记(1)使用if __name__ == "main"
查看>>
二进制的最大公约数
查看>>
Mybatis学习笔记(一) 之框架原理
查看>>
ABSTRACT的方法是否可同时是STATIC,是否可同时是NATIVE,是否可同时是SYNCHRONIZED?
查看>>
【SPL标准库专题(10)】SPL Exceptions
查看>>
《Python从入门基础到实践》
查看>>
【读入优化】
查看>>