Що робить [STAThread]?


Відповіді:


240

По STAThreadAttributeсуті, це вимога, щоб насос повідомлень Windows спілкувався з компонентами COM. Хоча основні Windows Forms не використовують COM, у багатьох компонентах ОС, таких як діалоги системи, використовується ця технологія.

MSDN пояснює причину дещо детальніше:

STAThreadAttribute вказує, що модель різьблення COM для програми є однопоточною квартирою. Цей атрибут повинен бути присутнім у точці входу будь-якої програми, яка використовує Windows Forms; якщо він пропущений, компоненти Windows можуть працювати неправильно. Якщо атрибута немає, програма використовує багатопоточну модель квартири, яка не підтримується для Windows Forms.

Ця публікація в блозі ( чому потрібен STAThread? ) Також досить добре пояснює цю вимогу. Якщо ви хочете більш детально переглянути, як працює модель різьблення на рівні CLR, перегляньте цю статтю журналу MSDN від червня 2004 року (Архівовано, квітня 2009 р.).


1
будь-яка ідея, чому CompactFramework не підтримує [STAThread]?
bvdb

1
stackoverflow.com/questions/4154429/apartmentstate-for-dummies Ця відповідь цілком зрозуміла для смертних, як я. Додано лише для довідки тут
Barış Akkurt

41

Він повідомляє компілятору, що ви є моделлю квартири з однією ниткою. Це злі COM речі, зазвичай вони використовуються для Windows Forms (GUI), оскільки для його малювання використовується Win32, який реалізований як STA. Якщо ви використовуєте щось, що є моделлю STA з декількох потоків, ви отримуєте пошкоджені об'єкти.

Ось чому вам доведеться посилатися на Gui з іншого потоку (якщо ви робили будь-які форми кодування).

В основному не хвилюйтеся з цього приводу, просто прийміть, що теми GUI Windows повинні бути позначені як STA, інакше трапляються дивні речі.


2
STAThread не має нічого спільного з вимогою викликати основний потік під час доступу до GUI. Це просто пов'язано з характером накачки повідомлень Windows, і не можна уникнути більш загального в багатопотокових додатках.
Нолдорін

3
Дійсно, мова йде лише про COM-компоненти, такі як діалоги ОС та сторонні компоненти.
Нолдорін

3
Win32 не містить поняття різьблення квартир, її COM, який вводить цю концепцію. COM "перенаправляє" те, що була цілком потоковою агностичною системою (насос повідомлення Windows) як засіб для синхронізації / послідовного виконання коду в COM-квартирах.
AnthonyWJones

1
Просто прийміть, що голова Windows Gui повинна бути позначена як STA, інакше трапляються дивні речі. :))))))
Ніпуна

1
@Noldorin "вимога викликати основну нитку" - це технічно не є вимогою . Винятки з перехресних потоків не трапляються поза налагоджувачем. Посилання: stackoverflow.com/questions/3972727/… . Не кажучи, що ви не повинні вирішувати цю проблему!
Шив

31

STAThreadAttribute позначає нитку для використання однопотокової COM-квартири, якщо потрібна COM. За замовчуванням .NET взагалі не ініціалізує COM. Тільки тоді, коли COM потрібен, наприклад, коли створюється об'єкт COM або COM Control або потрібне перетягування "n", це COM ініціалізується. Коли це станеться.

Детальніше читайте тут (в архіві, червень 2009 р.)

і

Чому потрібен STAThread?

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.