Я использую внешний компонент, который периодически снимает события из рабочего потока. В моем обработчике событий я использую Dispatcher для вызова некоторого метода в основном потоке. Это прекрасно работает...
private void HandleXYZ(object sender, EventArgs e)
{
...
if(OnTrigger != null)
dispatcher.Invoke(OnTrigger, new TimeSpan(0, 0, 1), e);
}
Однако, когда программа завершает работу и внешний компонент Dispose ()s, программа иногда зависает (и ее можно увидеть и убить только в диспетчере задач ).
Когда я смотрю на то, что происходит, похоже, что «компонент» ожидает возврата события в основной поток (, он остается в методе Dispose ()), в то время как рабочий поток ждет, пока диспетчер завершит работу. вызываем упомянутый вызов основного потока (он висит в строке dispatcher.Invoke -).
На данный момент я решил проблему с отключением, добавив тайм-аут в Invoke, который, кажется, работает, но кажется неправильным. Есть ли более чистый способ сделать что-то подобное? Могу ли я заставить основной поток занять некоторое время для заданий из других потоков перед завершением работы?
Я пытался "отключить" событие перед завершением работы, но это не помогает, потому что диспетчер (может быть )уже ожидающим,когда программа начинает закрываться...
PS :внешний компонент здесь означает, что у меня нет доступа к исходному коду...