Я захожу в тупик, когда вызываю поток пользовательского интерфейса из рабочего потока. Действительно, рабочий поток заблокирован в строке вызова:
return (ucAvancementTrtFamille)mInterfaceTraitement.Invoke(d, new object[] { psFamille });
Странно то, что поток пользовательского интерфейса (который, поправьте меня, если я ошибаюсь, является основным потоком) простаивает.
Есть ли способ :
На изображении ниже мы видим, что рабочий поток (ID 3732) заблокирован в строке Invoke, а MainThread простаивает в основной функции приложения.
Edit: Вот стек основного потока:
Edit2: Фактически, я приостановил программу во второй раз, и вот как выглядит стек например:
Edit3: Обходной путь найден
Я наконец нашел обходной путь. Проблема, по-видимому, связана с гонкой асинхронной оболочки рабочий поток заблокирован в строке вызова:
return (ucAvancementTrtFamille)mInterfaceTraitement.Invoke(d, new object[] { psFamille });
Странно то, что поток пользовательского интерфейса (который, поправьте меня, если я ошибаюсь, является основным потоком) бездействует.
Есть ли способ:
Мы можем видеть на изображении ниже рабочий поток (ID 3732), заблокированный в строке Invoke, и MainThread простаивает в основной функции приложения.
Edit: Вот стек основного потока:
Edit2: На самом деле, я приостановил программу во второй раз, и вот как выглядит стек:
Edit3: Обходной путь найден
Я наконец нашел обходной путь. Проблема, по-видимому, связана с гонкой асинхронной оболочки рабочий поток заблокирован в строке вызова:
return (ucAvancementTrtFamille)mInterfaceTraitement.Invoke(d, new object[] { psFamille });
Странно то, что поток пользовательского интерфейса (который, поправьте меня, если я ошибаюсь, является основным потоком) бездействует.
Есть ли способ:
Мы можем видеть на изображении ниже рабочий поток (ID 3732), заблокированный в строке Invoke, и MainThread простаивает в основной функции приложения.
Edit: Вот стек основного потока:
Edit2: На самом деле, я приостановил программу во второй раз, и вот как выглядит стек:
Edit3: Обходной путь найден
Я наконец нашел обходной путь. Проблема, по-видимому, связана с гонкой асинхронной оболочки
Есть ли способ:
На изображении ниже мы можем видеть рабочий поток (ID 3732) заблокирован в строке Invoke, и MainThread простаивает в основной функции приложения.
Edit: Вот стек основного потока:
Edit2: Фактически, я приостановил программу во второй раз , и вот как выглядит стек:
Edit3: Обходной путь найден
Наконец-то я нашел обходной путь. Проблема, по-видимому, связана с гонкой асинхронной оболочки
Есть ли способ:
На изображении ниже мы можем видеть рабочий поток (ID 3732) заблокирован в строке Invoke, и MainThread простаивает в основной функции приложения.
Edit: Вот стек основного потока:
Edit2: Фактически, я приостановил программу во второй раз , и вот как выглядит стек:
Edit3: Обходной путь найден
Наконец-то я нашел обходной путь. Проблема, по-видимому, связана с гонкой асинхронной оболочки Вот стек основного потока:
Edit2: На самом деле, я приостановил программу во второй раз, и вот как выглядит стек:
Edit3: Обходной путь найден
Я наконец нашел обходной путь. Проблема, по-видимому, связана с гонкой асинхронной оболочки Вот стек основного потока:
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);
Это некрасиво, но это единственное решение, которое я нашел.