2009-12-29 46 views
1

Control.Invoke在擁有控件底層窗口句柄的線程上執行指定的委託。爲什麼需要Control.Invoke?

多年來,我剛剛接受,這是它必須的方式,但我從來沒有明白爲什麼。

我能想到的唯一的事情是代碼是非常不安全的代碼,而不是僅僅在控制代碼中添加一點同步,框架只是不允許它,並迫使我們放棄這條路線 - 洗澡水!

  • 難道是微軟懶惰,還是有東西我只是沒有得到?

  • 做其他的編程框架/其他操作系統也有類似的問題,還是僅僅是一個Windows的事情嗎?

  • 除了改變我們的應用程序中的每個功能,有沒有辦法解決它?

回答

5

這是底層Windows用戶界面的限制,與.NET框架本身無關。在控件和窗口上執行許多操作(在Windows中,而不是組件模型意義上)需要在創建窗口句柄的線程上執行操作。 .NET框架就像任何其他應用程序一樣,必須遵守此規則。

當然,微軟可能會在框架中同步化以防止此問題,但這樣做會爲不需要該功能的應用程序增加大量性能開銷(因爲它們主要是單線程的)。

微軟的決定是強制那些需要開銷的人明確地管理它,而不是強迫每個人。

+0

好吧,我明白不想有額外的性能開銷,但難道不類似的開銷框架調用Control.Invoke本身,而不是提高「跨線程操作無效:控制‘的名字在這裏’從訪問一個線程,而不是它創建的線程「異常? – 2009-12-29 09:43:30

+1

調用Control.Invoke有一定的責任,框架不能簡單地假定應用程序知道。例如,如果你不小心,你可以創建死鎖情況,如果框架只是爲你做的,它可能會在你不知情的情況下創建死鎖。這是一個很好的例子http://social.msdn.microsoft.com/forums/en-US/clr/thread/a35e5298-33c4-4461-b956-bf265484219e – 2009-12-29 09:48:08

+0

好吧,是的,我明白這一點。謝謝,這有點讓我感到困惑! – 2009-12-29 10:21:44

0

關於在UI線程上執行封送處理有一個深入的review