Не удалось установить указанное состояние com-квартиры


Похоже, что я действительно не очень хорошо разбираюсь в многопоточных приложениях. Я пытаюсь открыть FolderBrowserDialog, но получаю исключение, говорящее мне:

Current thread must be set to single thread apartment (STA) mode before OLE calls can be made.

У меня есть STAThreadAttribute, установленный в моем основном методе, но FolderBrowserDialog вызывается из потока, отличного от моего основного потока. Я пытался

Thread.CurrentThread.SetApartmentState(ApartmentState.STA);

, но это дало исключение Failed to set the specified COM apartment state.

У меня есть временное исправление, которое создает новый поток в режиме STA и открывает FolderBrowserDialog, но я хотел бы иметь более аккуратное решение. Что вызывает неспособность установить состояние квартиры в STA?

1 4

1 ответ:

Вы должны вызвать SetApartmentState () Перед запуском потока. COM инициализируется средой CLR до того, как поток начнет выполнять любой управляемый код. Также обратите внимание, что вы не можете сделать это на потоках threadpool, включая BackgroundWorker.

Использование windows более чем в одном потоке-вообще плохая идея. Окна в потоке не имеют отношения Z-порядка к окнам в основном потоке пользовательского интерфейса. Это может вызвать очень неудобные проблемы с удобством использования. Как этот диалог прячется за главным окном. Кнопки на панели задач тоже нет, пользователь никогда ее не найдет.

Не делайте этого, используйте контроль.Вызовите (), чтобы диалоговое окно было модальным для других окон. Или вообще, используйте рабочие потоки только для задач, не связанных с пользовательским интерфейсом.