• 子线程更新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# vb .net实现淡出效果特效滤镜
    <<薪资至少10K的一道题,你能拿下吗>>练习
    职场生存规则--水
    简单摸拟电梯程序
    回收期计算
    徒手写汉诺塔
    没有方法的算法代码
    听说是阿里笔试题
    工作任务的分解
    纯吐槽,关于现在的一些混乱情况.
  • 原文地址:https://www.cnblogs.com/xihong2014/p/13924114.html
Copyright © 2020-2023  润新知