могу ли я изменить характер потока, который будет BeginInvoke моего делегата?

#.net #com #asynchronous #begininvoke #apartment-state

#.net #com #асинхронный #begininvoke #состояние квартиры

Вопрос:

Я реализую интерфейс, который имеет пару BeginSomething() и EndSomething() , и моя реализация заключается в методе Execute()

Итак, я создаю Action action = Execute и вызываю action.BeginInvoke в BeginSomething и action.EndInvoke в EndSomething . Однако мой метод Execute должен вызываться потоком, состояние квартиры которого равно STA (однопоточная квартира). Обычно это делается путем вызова Thread.SetApartmentState , но в этом случае я не знаю, какой поток собирается вызвать мой метод.

Как мне сделать вызывающий поток STA?

Ответ №1:

Если ваш класс реализует эти методы пары Begin / End в соответствии с интерфейсом, то у вас есть контроль над тем, как на самом деле выполняется работа. Делегаты (действие которых является типизированным универсальным) будут использовать пул потоков по умолчанию, я полагаю, и поэтому будут выполняться общим доступным потоком многократного использования. Поскольку возиться с пулом потоков невозможно, прямые делегаты в этом случае не годятся.

Вам нужно будет создать свой собственный объект Thread (передав новый ThreadStart вашему методу) и установить для него состояние apartment, как вы уже указали. У этого метода просто должен быть свой собственный способ обратного вызова, поскольку, насколько мне известно, ванильные потоки не предоставляют удобного способа.

Вы также могли бы при желании использовать задачи вместе с пользовательским StaTaskScheduler, если вы используете .NET 4.0, но это может вызвать больше проблем и / или усложнений, чем того стоит, поскольку добавляет много зависимостей. Однако это устраняет проблему обратного вызова.