UI操作BackgroundWorker與Thread

當用戶執行一個非常耗時的操作時,如果不借助Thread編程,用戶就會感覺界面反映很遲鈍。在.Net 2.0中可以通過BackgroundWork非常方便地進行Thread編程
//使用BackgroundWorker控件
public partial class Form1 : Form
    {

        public Form1()
        {
            InitializeComponent();
            CheckForIllegalCrossThreadCalls = false;
        }
        void test()
        {

            String[] s = { "111", "222" };
            for (int i = 0; i < s.Length; i++)
            {
                comboBox1.Items.Add(s[i]);
            }
        }

        private void Form1_Load(object sender, EventArgs e)
        {
           
            backgroundWorker1.RunWorkerAsync();
        }

        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            test();
        }
    }

//使用Thread 
public partial class Form1 : Form
    {

        public Form1()
        {
            InitializeComponent();
            //CheckForIllegalCrossThreadCalls = false;
            //不使用CheckForIllegalCrossThreadCalls線程間操作控件就要使用委託
        }
        void bind()
        {
            this.BeginInvoke(new testdelegate(test));

        }
        delegate void testdelegate();
        void test()
        {

            String[] s = { "111", "222" };
            for (int i = 0; i < s.Length; i++)
            {
                comboBox1.Items.Add(s[i]);
            }
        }

        private void Form1_Load(object sender, EventArgs e)
        {

            Thread t = new Thread(new ThreadStart(bind));
            t.Start();
        }

    
    }


線程間操作無效:

訪問 Windows 窗體控件本質上不是線程安全的。如果有兩個或多個線程操作某一控件的狀態,則可能會迫使該控件進入一種不一致的狀態。還可能出現其他與線程相關的 bug,包括爭用情況和死鎖。確保以線程安全方式訪問控件非常重要。

.NET Framework 有助於在以非線程安全方式訪問控件時檢測到這一問題。在調試器中運行應用程序時,如果創建某控件的線程之外的其他線程試圖調用該控件,則調試器會引發一個 InvalidOperationException,並提示消息:“從不是創建控件 control name 的線程訪問它。”

此異常在調試期間和運行時的某些情況下可靠地發生。強烈建議您在顯示此錯誤信息時修復此問題。在調試以 .NET Framework 2.0 版之前的 .NET Framework 編寫的應用程序時,可能會出現此異常。

可以通過將 CheckForIllegalCrossThreadCalls 屬性的值設置爲 false 來禁用此異常。這會使控件以與在 Visual Studio 2003 下相同的方式運行。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章