Отсутствует важная информация о том, что на самом деле делает RunOnBackground () .В противном случае это хорошее совпадение с тем, что происходит, когда в рабочем потоке вы используете COM-объекты с многопоточной квартирой.COM автоматически выполняет маршализацию любого вызова метода для такого объекта из рабочего потока в поток STA, в котором он был создан.
Это может хорошо работать только тогда, когда поток STA соблюдает требования потоков STA.Он должен прокачать цикл сообщений и не может блокироваться.Нарушение этих правил делает очень вероятным взаимоблокировку, вызов рабочего потока не может быть завершен, пока поток STA не отправит маршалированный вызов.Верным признаком того, что это происходит, является то, что Thread.Join () решает проблему.Он накачивает цикл сообщений внутри CLR, когда он вызывается в потоке STA.
Чтобы диагностировать это, вам потребуется Debug + Windows + Threads, чтобы увидеть, что блокирует этот рабочий поток.Если мои предположения верны, они будут погребены глубоко в слесарном коде COM, ожидая завершения маршализованного вызова.Это можно увидеть, только включив отладку неуправляемого кода и настроив Microsoft Symbol Server, чтобы вы получили отладочные символы для программного кода и получили надежную трассировку стека.
Исправить это будет сложно.Вы не можете волшебным образом переключить коммутатор и запустить код в потоке, если он явно заявил, что не поддерживает многопоточность.Крайне важно, чтобы вы создали экземпляр COM-объекта в том же потоке, который вызывает его методы.И эта нить должна быть нитью STA.Проверьте этот пример кода для подхода.Если вы не контролируете создание COM-объекта, вы застряли.