Control.InvokeRequired 屬性

定義

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

public:
 property bool InvokeRequired { bool get(); };
[System.ComponentModel.Browsable(false)]
public bool InvokeRequired { get; }
[<System.ComponentModel.Browsable(false)>]
member this.InvokeRequired : bool
Public ReadOnly Property InvokeRequired As Boolean

屬性值

Boolean

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

實作

屬性

備註

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

注意

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

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

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

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

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

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

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

注意

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

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

適用於

另請參閱