关闭

线程间操作无效

291人阅读 评论(22) 收藏 举报

    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>

效果图如下:


 
0
1

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:158853次
    • 积分:12327
    • 等级:
    • 排名:第1146名
    • 原创:214篇
    • 转载:0篇
    • 译文:0篇
    • 评论:5040条
    和我联系
    菜鸟也有春天~
      我的个人网站
      为你更新系列文章,扫码访问我的个人网站
    博客专栏