程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> c#中使用多線程訪問winform中控件的若干問題(2)

c#中使用多線程訪問winform中控件的若干問題(2)

編輯:關於C語言
面來看第二種方案,就是使用delegate和invoke來從其他線程中控制控件信息。網上有很多人寫了 這種控制方式,然而我看了很多這種帖子,表明上看來是沒有什麼問題的,但是實際上並沒有解決這個問 題,首先來看網絡上的那種不完善的方式:

public partial class Form1 : Form
    {
        private delegate void FlushClIEnt();//代理
        public Form1()
        {
            InitializeComponent();
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            Thread thread = new Thread(CrossThreadFlush);

             thread.IsBackground=true;
            thread.Start();
        }

        private void CrossThreadFlush()
        {
            //將代理綁定到方法
            FlushClient fc = new FlushClIEnt(ThreadFuntion);
            this.BeginInvoke(fc);//調用代理
        }
        private void ThreadFuntion()
        {
            while (true)
            {
                this.textBox1.Text = DateTime.Now.ToString();
                Thread.Sleep(1000);
            }
        }
    }

使用這種方式我們可以看到跨線程訪問的異常沒有了。但是新問題出現了,界面沒有響應了。為什麼 會出現這個問題,我們只是讓新開的線程無限循環刷新,理論上應該不會對主線程產生影響的。其實不然 ,這種方式其實相當於把這個新開的線程“注入”到了主控制線程中,它取得了主線程的控制。只要這個 線程不返回,那麼主線程將永遠都無法響應。就算新開的線程中不使用無限循環,使可以返回了。這種方 式的使用多線程也失去了它本來的意義。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved