Control.InvokeRequired 屬性

定義

取得一個值。這個值會指示是否由於呼叫端是在建立控制項之執行緒以外的執行緒,因此在進行控制項的方法呼叫時,應呼叫叫用 (Invoke) 方法。

C#
[System.ComponentModel.Browsable(false)]
public bool InvokeRequired { get; }

屬性值

如果控制項的 true 是在呼叫執行緒以外的執行緒上建立,則為 Handle (表示必須透過叫用方法呼叫),否則為 false

實作

屬性

備註

Windows Forms中的控制項會系結至特定執行緒,而且不是安全線程。 因此,如果您要從不同的執行緒呼叫控制項的 方法,則必須使用其中一個控制項的叫用方法封送處理對適當執行緒的呼叫。 這個屬性可用來判斷您是否必須呼叫叫用方法,如果您不知道哪個執行緒擁有控制項,這非常有用。

備註

除了 InvokeRequired 屬性之外,控制項上還有四個方法可以安全呼叫: InvokeBeginInvoke 如果已經建立控制項的控制碼, EndInvokeCreateGraphics 為 。 在背景執行緒上建立控制項的控制碼之前呼叫 CreateGraphics ,可能會導致不合法的跨執行緒呼叫。 對於所有其他方法呼叫,您應該在不同的執行緒呼叫時,使用這些叫用方法之一。

如果控制項的控制碼尚不存在, InvokeRequired 請搜尋控制項的父鏈結,直到它找到具有視窗控制碼的控制項或表單為止。 如果找不到適當的控制碼,方法 InvokeRequired 會傳 false 回 。

這表示 InvokeRequired 如果 Invoke 不需要, (呼叫發生在相同的執行緒) ,或控制項是在不同的執行緒上建立,但尚未建立控制項的控制碼,則可以傳回 false

在控制項的控制碼尚未建立的情況下,您不應該直接呼叫 控制項上的屬性、方法或事件。 這可能會在背景執行緒上建立控制項的控制碼,並在沒有訊息幫浦的情況下隔離線程上的控制項,並讓應用程式不穩定。

您也可以檢查在背景執行緒上傳回 false 時的 InvokeRequiredIsHandleCreated ,以防止這種情況。 如果尚未建立控制項控制碼,您必須等到建立它之後再呼叫 InvokeBeginInvoke 。 一般而言,只有在應用程式 Application.Run(new MainForm()) 的主要表單建構函式中建立背景執行緒時,才會發生此情況 (,然後才會顯示或 Application.Run 呼叫表單。

其中一個解決方案是等到表單的控制碼建立之後,再啟動背景執行緒。 藉由呼叫 Handle 屬性來強制建立控制碼,或等到 Load 事件開始背景進程為止。

更好的解決方案是使用 所 SynchronizationContext 傳回的 SynchronizationContext ,而不是用於跨執行緒封送處理的控制項。

備註

如果應該處理訊息的執行緒不再使用中,可能會擲回例外狀況。

如需多執行緒Windows Forms控制項的詳細資訊,請參閱如何:使用背景執行緒來搜尋檔案如何:對Windows Forms控制項進行Thread-Safe呼叫

適用於

產品 版本
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
Windows Desktop 3.0, 3.1, 5, 6, 7, 8, 9, 10

另請參閱