zoukankan      html  css  js  c++  java
  • 子线程更新UI多个控件

    线程里如果需要更新多个UI控件,怎么办
                Thread thread = new Thread(delegate()
                {
                    Thread.Sleep(50);
                    img = HttpOper(httpPath);
                    if (pb.InvokeRequired)
                    {

                        pb.Invoke(LoadPic,img);

                    }
                    else
                    {
                        pb.Invoke(LoadPic);
                    }
                });
                thread.Start();
    这是一个基本的线程,PB是UI控件,如果我还有其它的控件也需要更新,难道是这样写
                Thread thread = new Thread(delegate()
                {
                    Thread.Sleep(50);
                    img = HttpOper(httpPath);
                    if (pb.InvokeRequired)
                    {

                        pb.Invoke(LoadPic,img);

                    }
                    else
                    {
                        pb.Invoke(LoadPic);
                    }
                    if (pb1.InvokeRequired)
                    {

                        pb1.Invoke(LoadPic,img);

                    }
                    else
                    {
                        pb1.Invoke(LoadPic);
                    }
                    if (pb2.InvokeRequired)
                    {

                        pb2.Invoke(LoadPic,img);

                    }
                    else
                    {
                        pb2.Invoke(LoadPic);
                    }
                });
                thread.Start();

    ------解决思路----------------------
    你可以认为多个UI控件都属于同一个UI线程。因此,pb1.Invoke,和pb2.Invoke,和form1.Invoke没有本质的区别。
    因此可以利用一个通用的函数,来把一个操作(Action)放到UI线程上去执行:


    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        public void SendAction(Action action)
        {
            if (this.InvokeRequired)
            {
                this.Invoke(action);
            }
            else
            {
                action();
            }
        }

        void Test()
        {
            Thread thread = new Thread(delegate()
            {
                Thread.Sleep(50);
                img = HttpOper(httpPath);

                this.SendAction(() => { pb1.Image = img; });
                this.SendAction(() => { pb2.Image = img; });
            });
            thread.Start();
        }
    }
    http://www.myexception.cn/c-sharp/1828967.html
  • 相关阅读:
    泛型-----------C#
    wpf风格的数据绑定------WPF
    wpf引用外部样式及外部样式的复杂写法--------WPF
    线程的最简易写法-------------android
    Fragment的用法(类似于.net的用户控件,重用性好)。。。。---------------android
    写一个事件(不仅仅是为控件添加事件)------------C#
    页面跳转(带返回参数的)---------android
    构造函数(构造器)的正确重载方式------类
    利用 CSS3 判断手机是横屏还是竖屏
    AngularJS Or jQuery 省份城市二级联动下拉功能
  • 原文地址:https://www.cnblogs.com/xihong2014/p/13924114.html
Copyright © 2011-2022 走看看