C#多线程 后台运行 访问控件fm

1、在开启一个线程,在后台运行

//要在后台执行的内容
        void doSth()
        { }
        void test()
        {
            ThreadStart ts = new ThreadStart(() => doSth());
            Thread t = new Thread(ts);
            t.IsBackground = true;
            t.Start();
        }

2、启用后台运行后,需通过以下代码去访问控件,此方法对基于Control类的控件均适用,其它一些特殊控件可按照此方法去扩展。

        //控件访问通用代码
        void ControlThreadModify(Control ctrl, Action action)
        {
            if (ctrl.InvokeRequired)
                ctrl.BeginInvoke(new Action<Control, Action>((t1, t2) => { ControlThreadModify(t1, t2); }), ctrl, action);
            else
            {
                if (action != null) action();
            }
        }
        //调用示例,设置窗体的文本为“a”
        void exp()
        {
            ControlThreadModify(this, () => this.Text = "a");
        }

下面内容可配合使用……

        //设置控件下面所有控件的有效属性
        void FormEnabled(bool b, Control ctrl)
        {
            foreach (Control c in ctrl.Controls)
            {
                c.Enabled = b;
                if (c.Controls.Count > 0)
                    FormEnabled(b, c);
            }
        }
        public void Method1(Data data) {     
        //线程的方式     new Thread((ThreadStart)delegate    
        {         
                forint i=0 ;i<3;i++)         
                {             
                    if(满足条件)             
                    {                 
                        break;             
                    }             
                    else            
                    {                
                        System.Threading.Thread.Sleep(50000);//线程休眠50秒                 
                        this.Invoke((EventHandler)delegate{MethodA(data);});             
                    }         
                }     
        }).Start(); }
        public void Method1(Data data) {     
        //线程的方式     
            new Thread((ThreadStart)delegate    
            {         
                forint i=0 ;i<3;i++)         
                {             
                    if(满足条件)             
                    {                 
                        break;             
                    }             
                    else            
                    {                
                        System.Threading.Thread.Sleep(50000);//线程休眠50秒                 
                        this.Invoke((EventHandler)delegate{MethodA(data);});             
                    }         
                }     
            }).Start(); 
        }


本人原创,欢迎大家指正!转载请注明出处

原文地址:https://www.cnblogs.com/fm168/p/2920203.html