程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C# WinForm 跨線程訪問控件

C# WinForm 跨線程訪問控件

編輯:C#入門知識

   在做WinForm應用的時候,大部分情況下都會碰到在線程中訪問界面上控件的問題;然而我們並不能用傳統方法來訪問界面上的控件,c#中禁止跨線程直接訪問控件,InvokeRequired就是為了解決這個問題而產生的。

        Control.InvokeRequired     

        獲取一個值,該值指示調用方在對控件進行方法調用時是否必須調用 Invoke 方法,因為調用方位於創建控件所在的線程以外的線程中。

        如果控件的 Handle 是在與調用線程不同的線程上創建的(說明您必須通過 Invoke 方法對控件進行調用),則為 true;否則為 false。
        Windows 窗體中的控件被綁定到特定的線程,不具備線程安全性 。因此,如果從另一個線程調用控件的方法,那麼必須使用控件的一個 Invoke 方法來將調用封送到適當的線程。該屬性可用於確定是否必須調用 Invoke 方法,當不知道什麼線程擁有控件時這很有用。

        下面來說下用法:

         1、定義一個委托,與這個事件處理函數的簽名一樣委托,如:private delegate void InvokeCallback(string msg);       

         2、判斷這個屬性的值來決定是否要調用Invoke函數

        void ShowMessage(string msg)
        {
            if (richTextBox_Esdd.InvokeRequired)
            {
                InvokeCallback msgCallback = new InvokeCallback(ShowMessage);
                richTextBox.Invoke(msgCallback, new object[] { msg });
            }
            else
            {
                if (this.richTextBox.Lines.Length > 600)
                {
                    this.richTextBox.Text = "";
                }

                richTextBox.AppendText(msg);
            }

        }

 

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