У меня возникает тупик, когда я вызываю поток пользовательского интерфейса из рабочего потока. Действительно, рабочий поток блокируется в строке вызова:
return (ucAvancementTrtFamille)mInterfaceTraitement.Invoke(d, new object[] { psFamille });
Странно то, что поток пользовательского интерфейса (который, поправьте меня, если я ошибаюсь, является основным потоком) простаивает.
Есть ли способ:
- посмотреть, какой поток я на самом деле пытаюсь вызвать?
- посмотреть, что на самом деле делает указанный поток?
На изображении ниже мы видим, что рабочий поток (ID 3732) заблокирован на линии Invoke, а MainThread простаивает в основной функции приложения.
Изменить: вот стек основного потока:
Edit2: На самом деле, я приостановил программу во второй раз, и вот как выглядит стек:
Edit3: Найден обходной путь
Наконец-то я нашел обходной путь. Проблема, по-видимому, связана с проблемой состояния гонки асинхронной оболочки. Обходной путь — использовать BeginInvoke и ждать его с тайм-аутом. Когда время ожидания истечет, вызовите его снова и выполните цикл, пока он, наконец, не вернется. В большинстве случаев это действительно работает со второго звонка.
IAsyncResult ar = mInterfaceTraitement.BeginInvoke(d, new object[] { psFamille });
while (!ar.AsyncWaitHandle.WaitOne(3000, false))
{
ar = mInterfaceTraitement.BeginInvoke(d, new object[] { psFamille });
}
// Async call has returned - get response
ucAvancementTrtFamille mucAvancementTrtFamille = (ucAvancementTrtFamille)mInterfaceTraitement.EndInvoke(ar);
Это некрасиво, но это единственное решение, которое я нашел.
d
? - person Henk Holterman   schedule 21.09.2010