1. 程式人生 > >C# 解決子執行緒不能操作主執行緒UI(介面)問題,涉及到多執行緒的概念。

C# 解決子執行緒不能操作主執行緒UI(介面)問題,涉及到多執行緒的概念。

1、在預設情況下,C#不准許在一個執行緒中直接訪問或操作另一執行緒中建立的控制元件,這是因為訪問windows窗體控制元件本質上是不安全的。

2、執行緒之間是可以同時執行的,那麼如果有兩個或多個執行緒同時操作某一控制元件的某狀態,嘗試將一個控制元件變為自己需要的狀態時, 執行緒的死鎖就可能發生。

3、為了區別是否是建立該控制元件的執行緒訪問該控制元件,Windows窗體控制元件中的每個控制元件都有一個InvokeRequired屬性,這個屬性就是用來檢查本控制元件是否被其他執行緒呼叫的屬性,當被建立該執行緒外的執行緒呼叫的時候InvokeRequired就為true。有了這個屬性我們就可以利用它來做判斷了。

4、光判斷出是否被其他執行緒呼叫是沒有用的,所以windows窗體控制元件中還有一個Invoke方法可以幫我們完成其他執行緒對控制元件的呼叫。結合代理的使用就可以很好的完成我們的目標。

方法一:

public Form1()
  {            
       InitializeComponent();
        //加上這個檢測功能
    CheckForIllegalCrossThreadCalls = false;
  }

方法二:

using System;
using System.Threading;
using System.Windows.Forms;

namespace TestingUIThread
{
    public partial class Form1 : Form
    {
        Thread thread = null;

        public Form1()
        {
            
            InitializeComponent();
        }

        private void btnEnable_Click(object sender, EventArgs e)
        {
            thread = new Thread(new ParameterizedThreadStart(EnableButton));
            thread.Start(null);
        }

        private void EnableButton(object o)
        {
            EnableButton();
        }

        private delegate void EnableButtonCallBack();

        private void EnableButton()
        {
            if (this.btnTest.InvokeRequired)
            {
                this.Invoke(new EnableButtonCallBack(EnableButton));
            }
            else
            {
                btnTest.Enabled = true;
                btnTest.Text = "Enabled";
            }
        }
    }
}