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

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

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

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

1 ответ

Решение

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

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

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

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