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

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

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

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

Thread.CurrentThread.SetApartmentState(ApartmentState.STA);

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

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

1 ответ

Решение

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

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

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

Другие вопросы по тегам