「從不是建立XX控制項的執行緒訪問它」錯誤的解決方法!

2021-04-22 23:45:52 字數 1626 閱讀 6958

在有些情況下,您可能需要通過執行緒呼叫控制項的方法。例如,您可能要在窗體上呼叫乙個禁用按鈕或更新顯示的方法來響應某個執行緒執行的操作。.net framework 提供從任何執行緒都可安全呼叫的方法,以呼叫與其他執行緒所擁有的控制項進行互動的方法。invoke 方法允許同步執行控制項上的方法,而 begininvoke 方法則初始化非同步執行。要使用這些方法,必須用與將呼叫的方法相同的簽名宣告委託。然後,您可以通過向要呼叫的方法提供適當的委託來呼叫窗體上任何控制項的 invoke 或 begininvoke 方法。任何必需的引數都包裝在 object 中,並被傳輸到該方法。

呼叫涉及其他執行緒所擁有的控制項的方法

用與要呼叫的方法相同的簽名宣告乙個委託。

下面的示例顯示如何使用 integer 和 string 引數宣告委託。

呼叫涉及其他執行緒所擁有的控制項的方法

用與要呼叫的方法相同的簽名宣告乙個委託。

下面的示例顯示如何使用 integer 和 string 引數宣告委託。

>visual basic

public delegate sub mydelegate(byval aninteger as integer, byval _

astring as string)

>c#

public delegate void mydelegate(int aninteger, string astring);

使用任何控制項來呼叫對其他執行緒所擁有的控制項進行操作的方法。

注意:

方法所需的引數(如果有)可在 object 中提供。

如果要同步呼叫方法,請呼叫 control.invoke 方法。

>visual basic

label1.invoke(new mydelegate(addressof mymethod), new _

object() )

>c#

label1.invoke(new mydelegate(mymethod), new object );

如果要非同步呼叫方法,請呼叫 control.begininvoke 方法。

>visual basic

label1.begininvoke(new mydelegate(addressof mymethod), _

new object() )

>c#

label1.begininvoke(new mydelegate(mymethod), new

object );

-----------------------------

舉個例子:新建乙個windows應用程式專案win1,在窗體form1中新增乙個button名稱為button1,然後轉入**頁,按下面修改**

using system;

using system.windows.forms;

namespace win1

private void button1_click(object sender, eventargs e)//此處先雙擊button1以便產生**並且自動建立事件委託

public void 設定文字()

public void 新執行緒() }

} 執行:單擊button1,兩秒之後文字發生變化

關於 從不是建立控制項的執行緒訪問它」

textbox的text屬性等等。如果直接設定程式必定會報出 從不是建立控制項的執行緒訪問它,這個異常。通 常我們可以採用兩種方法來解決。一是通過設定control的屬性。二是通過delegate,而通過delegate也有 兩種方式,一種是常用的方式,另一種就是匿名方式。下面分別加以說明.首先,通...

執行緒間操作無效 從不是建立控制項的執行緒訪問它

using system using system.threading using system.windows.forms private void button1 click object sender,eventargs e start 出現上述錯誤的原因是 net禁止了跨執行緒呼叫控制項。只...

執行緒間操作無效 從不是建立控制項的執行緒訪問它

下面介紹幾種跨執行緒呼叫控制項的方法 這是最簡單的辦法,相當於不檢查執行緒之間的衝突,允許各個執行緒隨便亂搞,最後lable1控制項的值是什麼就難以預料了 不推薦使用這種方法 public form1 呼叫控制項的invoke方法,就可以控制控制項了,例如 private void button2 ...