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