Тупик, когда рабочий поток пытается вызвать что-то в основном потоке

Я использую внешний компонент, который периодически снимает события из рабочего потока. В моем обработчике событий я использую 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 :внешний компонент здесь означает, что у меня нет доступа к исходному коду...

5
задан FrankB 19 July 2012 в 09:50
поделиться