У меня есть тупик, когда я вызываю поток пользовательского интерфейса из рабочего потока. Действительно, рабочий поток блокируется в строке invoke:
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);
Это не очень, но это единственное решение, которое я нашел.