я могу изменить характер потока, который будет инициировать мой делегат? - PullRequest
0 голосов
/ 13 апреля 2011

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

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

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

1 Ответ

2 голосов
/ 13 апреля 2011

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

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

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

...