У меня была такая же проблема с надстройкой Word - на очень громоздкой коробке разработчика - пользовательский интерфейс просто зависал, хотя я выполнял всю свою работу в фоновом режиме.
Моя теорияв том, что Word работал над потоком пользовательского интерфейса, хотя я вызывал его из фоновых потоков и т. д.
Я попытался провести эксперимент - создать экземпляр объекта Window в новом потоке (т. е. чтобы мой поток пользовательского интерфейса былне то же самое, что рабочий поток Word) - и это сработало.Мой пользовательский интерфейс больше не блокируется через случайные интервалы.
Будьте осторожны, чтобы избавиться от любых экземпляров объектов COM, прежде чем ваш поток закроется, и особенно остерегайтесь доступа к COM между потоками (возможно, с помощью Dispatcher.Invoke обратно кПоток приложения хоста Office при доступе к любому из его RCW ... - Диспетчеры связаны с потоками, в которых они создаются, поэтому вам просто нужно создать экземпляр диспетчера в обратном вызове приложения хоста офиса и т. Д ...)
Примечание: Если вы Dispatcher.Invoke вернетесь к вызывающему потоку, вы не сможете использовать Thread.Join, как показано ниже.(В этом случае вам нужно будет обрабатывать события приложения, Thread.Sleep и Thread.Yield) в занятом цикле.В противном случае вы получите тупик.
Вот пример обобщенной версии того, что я делаю:
// This approach makes WPF Windows an order of magnitude more responsive
Thread t = new Thread(() =>
{
try
{
// Implement the IDisposable pattern on your window to release
// any resources before the thread exits
using (var myWindow = new MyWindow())
{
// Do any other pre-display initialization with the myWindow
// object here...
myWindow.ShowDialog();
}
}
finally
{
// Strongly Recommended (not doing this may cause
// weird exceptions at application shutdown):
Dispatcher.CurrentDispatcher.InvokeShutdown();
}
});
t.SetApartmentState(ApartmentState.STA); // Required
t.IsBackground = false; // Recommended
t.Start(); // Kicks off the new UI thread
t.Join(); // Blocks execution until the new UI thread has finished executing...