TimerCallback Делегат для управления компонентом библиотеки .NET модели STA - PullRequest
0 голосов
/ 29 июля 2010

Я пытаюсь использовать механизм делегата TimerCallback для управления экземплярами объектов из стороннего компонента библиотеки .NET в отдельных потоках, выполняющихся по времени.

Когда я пытаюсь создать экземплярДля объекта из библиотеки I возникла исключительная ситуация:

(имя объекта) можно вызывать только из однопотоковой квартиры (STA)

Подоснова, которая являетсяточка входа для моего приложения помечена как MTAThread, как в примере Microsoft для msdn здесь

1 Ответ

2 голосов
/ 29 июля 2010

Однопоточные COM-компоненты предъявляют жесткие требования к их созданию в потоке STA.Который вы создаете с помощью атрибута [STAThread] в вашем методе Main () и , используя цикл обработки сообщений.Например, созданный Application.Run ().

Теперь вы можете вызывать такой компонент из рабочего потока или обратного вызова таймера.COM обеспечивает выполнение однопоточного требования для компонента и маршалов, вызывающих поток STA.Чтобы победить то, что вы пытались выполнить, все вызовы компонента выполняются только в одном потоке.Вы сделаете это медленнее, а не быстрее.Маршалинг вызова не быстрый.

Здесь нет никакого секретного соуса, вы не можете волшебным образом превратить компонент, который явно заявил, что он не поддерживает многопоточность, в компонент с резьбой.И это не редкость: подавляющее большинство компонентов COM или, в этом отношении, компонентов .NET не поддерживают многопоточность.Разница между компонентами COM и .NET заключается в том, что COM что-то с этим делает.Компонент .NET обычно просто работает со сбоями в какой-либо гонке потоков без диагностики.

...