zoukankan      html  css  js  c++  java
  • 线程间操作无效


        C#窗体界面,需要刷新窗体上的某一个控件,发现像平时开一个线程那样没办法运行,查了一下,存在线程串位,大概意思是说windows窗体控件本质上线程不是安全的,因为如果两个或者多个线程操作某一个控件状态,则可能会迫使控件进入一种不一致的状态,甚至可能出现其他与线程相关的bug,最坏的情况就是争用无果,造成死锁,所以就出现了线程安全。
     
        如果在工作线程中去new一个thread去执行UI控件更新,这样不仅仅会给后台工作线程带来巨大的压力,而且导致UI控件的不安全更新,为了解决这个问题,网上给出了下面的例子。
        一开始的demo(普通的线程更新),代码如下:
    <span style="font-family:KaiTi_GB2312;font-size:18px;">namespace test
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
            private void DoWork()
            {
                this.textBox1.Text = "说谁文本框呢?";
            }
            private void btnok_Click(object sender, EventArgs e)
            {
                Thread thread = new Thread(new ThreadStart(DoWork));
                thread.Start();
            }
        }
    }</span>
        后来加入委托后的demo(将更新方法委托给了别的方法去执行),代码如下:
    <span style="font-family:KaiTi_GB2312;font-size:18px;">namespace test
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
            public delegate void MyInvoke(string str1, string str2);//定义一个委托事件
            public void DoWork()
            {
                MyInvoke mi = new MyInvoke(UpdateForm);//把updateform方法委托给mi
                //“BeginInvoke”再创建控件的基础句柄所在线程上,用指定的参数异步执行指定委托
                this.BeginInvoke(mi, new object[] { "说谁是文本框呢?", "胡闹" });//后面的两个参数为mi对象的参数,执行委托
            }
    
            public void UpdateForm(string param1, string param2)//定义一个更新窗体方法
            {
                this.textBox1.Text = param1 + param2;
            }
    
            private void btnok_Click(object sender, EventArgs e)
            {
                Thread thread = new Thread(new ThreadStart(DoWork));
                thread.Start();
            }
        }
    }</span>

    效果图如下:


     
  • 相关阅读:
    解决:Requested 'libdrm_radeon >= 2.4.56' but version of libdrm_radeon is 2.4.52
    解决Ubuntun 12.04编译Mesa10.3 WARNING: 'aclocal-1.14' is missing on your system
    交叉编译Mesa,X11lib,Qt opengl
    Qt5.4.1移植到arm——Linuxfb篇
    Qt5.3.0的安装与测试
    gstreamer——文档/资源/使用
    gst-rtsp-server编译测试
    gstreamer-tips-picture-in-picture-compositing
    Matlab实现加性高斯白噪声信道(AWGN)下的digital调制格式识别分类
    Matlab实现单(双)极性(不)归零码
  • 原文地址:https://www.cnblogs.com/zhoulitong/p/6412353.html
Copyright © 2011-2022 走看看