4

我一直在尋找所有的答案,這個問題,但似乎無法找到滿意的答案。也許這裏有人可以啓發我。的SynchronizationContext和InvokeRequired

我有BindingList<T>後代,爲了提高UI線程上的改變事件存儲到一個SynchronizationContext對象的引用。現在

,它也有可能是這個BindingList<T>創建和UI線程,而不是一個後臺線程上使用。我如何檢查這個沒有InvokeRequired這樣的房產對我有用?在UI線程上調用SynchronizationContext.Send有什麼後果?

+0

你最好檢查一下。在工作線程上創建綁定列表時,SynchronizationContext.Current將爲空。 Send()否則立即在UI線程上執行。 – 2011-03-28 22:37:54

+0

我將SynchronizationContext傳遞給列表,因爲它綁定到了UI。當我引發ListChanged事件時,我會在使用它之前檢查是否有一個SynchronizationContext。 – Dan 2011-03-29 01:53:14

回答

2

SynchronizationContext上的發送方法將同步執行並在與SynchronizationContext綁定的線程上調用該代理。如果SynchronizationContext綁定到UI線程和代碼在UI線程,然後委託只會直接,無需線程之間的編組上調用當前正在執行的。

-1

send方法將同步執行,並在UI線程上,這是事實。 但是,擔心的一個可能後果是調用Send將增加調用堆棧。

因此,舉例來說,下面的代碼:

for (int i = 0; i < 10000000; i++) syncContext.Send(....); 

會導致出現StackOverflow例外...... 這就是爲什麼它可能是明智的,避免使用同步上下文,如果你已經在希望的運轉線。 我不知道有任何全證據的方法來檢查該線程創建的列表中,做一些內部簿記旁邊。

+1

它當然不會!首先,堆棧是一個按線程分配的結構。所有發送都是發佈代理和**然後等待**完成。它通過一個Mutex來完成。您發佈的循環不會將工作線程或UI線程的堆棧增加1(在工作線程上發送,在UI線程上調用委託)。如果'SynchronizationContext'足夠聰明,從UI線程調用將只將一幀推送到堆棧。 – Gusdor 2014-01-08 15:59:55

相關問題