Я наконец-то смог решить проблему. Кто-то, кто разбирается в потоках лучше меня, может объяснить, почему. Я бы предположил, однако, что переключение потоков при попытке доступа к COM привело к его зависанию - вынуждая основной поток ждать, пока дочерний поток завершит работу. sh устраняет проблему.
public HTMLDocument GetDocument()
{
DateTime start = DateTime.Now;
childThread = new Thread(() => threadedGetDocument());
childThread.Start();
childThread.Join(new TimeSpan(0, 5, 0));
lock (lockObject)
{
if (childThreadDocument != null)
return childThreadDocument;
else
throw new ExecutionEngineException("Failed to open IE Document");
}
}
Обратите внимание, если вы создание приложения, которое должно быть отзывчивым, было бы ужасной идеей в том виде, в каком она реализована. Если бы такой вызов был сделан в потоке GUI, тогда приложение не отвечало бы на ввод пользователя в течение пяти минут. Однако мое приложение представляет собой консольное приложение, которое незаметно работает на виртуальной машине для обработки и распределения входящей работы. Короткая пауза не вредит.