簡體   English   中英

[STAThread] 是做什么的?

[英]What does [STAThread] do?

我正在學習 C# 3.5,我想知道[STAThread]在我們的程序中做了什么?

STAThreadAttribute本質上是 Windows 消息泵與 COM 組件通信的要求。 盡管核心 Windows 窗體不使用 COM,但操作系統的許多組件(例如系統對話框)確實使用了此技術。

MSDN稍微詳細地解釋了原因:

STAThreadAttribute 表示應用程序的 COM 線程模型是單線程單元。 該屬性必須存在於任何使用 Windows 窗體的應用程序的入口點; 如果省略,Windows 組件可能無法正常工作。 如果該屬性不存在,則應用程序使用 Windows 窗體不支持的多線程單元模型。

這篇博文(為什么需要 STAThread? )也很好地解釋了該要求。 如果您想更深入地了解線程模型如何在 CLR 級別工作,請參閱這篇 MSDN 雜志 2004 年 6 月的文章(存檔,2009 年 4 月)。

它告訴編譯器您處於單線程單元模型中。 這是一個邪惡的 COM 東西,它通常用於 Windows 窗體 (GUI),因為它使用 Win32 為其繪圖COM 拖放 COM 組件(感謝@AnthonyWJones),它作為 STA 實現。 如果您使用的是來自多個線程的 STA 模型,那么您會得到損壞的對象。

這就是為什么您必須從另一個線程調用 Gui(如果您已完成任何表單編碼)。

基本上不用擔心,只需接受必須將 Windows GUI 線程標記為 STA,否則會發生奇怪的事情。

如果需要 COM,STAThreadAttribute 標記一個線程使用單線程 COM 單元。 默認情況下,.NET 根本不會初始化 COM。 只有當需要 COM 時,例如創建 COM 對象或 COM 控件時,或者需要拖放時,COM 才會被初始化。 當發生這種情況時,.NET 調用底層的 CoInitializeEx 函數,該函數采用一個標志來指示是將線程加入多線程單元還是單線程單元。

在此處閱讀更多信息(2009 年 6 月存檔)

為什么需要 STAThread?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM