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;
        }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM