c#跨线程操作控件(有UI操作)|及多线程操作

仅记录(好多大佬都会):

跨线程操作UI控件

※在.NET2.0之后为了线程之间的安全,不允许跨线程操作控件,最简单的解决办法是禁止检查,但一般不猜用此方法,会造成各线程之间的混乱,可用作临时调试使用。

public Form1()
{
  InitializeCompoent();
  Control.CheckForIllegalCrossThreadCalls=false;
}

①跨线程操作UI控件

■测试实现的功能,单击按钮(button1),实现文本(label1)从0到100的自增

        private void button1_Click(object sender, EventArgs e)
        {
            Thread pThread = new Thread(new ThreadStart(this.ThreadProcSafe));
            pThread.Start();
        }
        public delegate void StringArgReturningVoidDelegate(string str);
        private void ThreadProcSafe()
        {
            for (int i = 0; i < 100; i++)
            {
                SetText(i.ToString());
                Thread.Sleep(100);
            }
        }
        private void SetText(string str)
        {
            if (this.label1.InvokeRequired)
            {
                StringArgReturningVoidDelegate d = new StringArgReturningVoidDelegate(SetText);
                this.Invoke(d, new object[] { str });
            }
            else
            {
                this.label1.Text = str;
            }
        }

②多线程,无UI操作

■使用backgroundWorker控件

        private void button1_Click(object sender, EventArgs e)
        {
            using (BackgroundWorker bw = new BackgroundWorker())
            {
                bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_complete);
                bw.DoWork += new DoWorkEventHandler(bw_DoWork);
                bw.RunWorkerAsync("SQYJ");
            }
        }
        public void bw_complete(object secder, RunWorkerCompletedEventArgs e)
        {
            MessageBox.Show("cs");
        }

        public void bw_DoWork(object sender, DoWorkEventArgs e)
        {
            Thread.Sleep(1000);
            e.Result = e.Argument;
        }

 

转载于:https://www.cnblogs.com/clgis/p/10096097.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值