Тупик при вызове потока пользовательского интерфейса из рабочего потока

Я захожу в тупик, когда вызываю поток пользовательского интерфейса из рабочего потока. Действительно, рабочий поток заблокирован в строке вызова:

return (ucAvancementTrtFamille)mInterfaceTraitement.Invoke(d, new object[] { psFamille });

Странно то, что поток пользовательского интерфейса (который, поправьте меня, если я ошибаюсь, является основным потоком) простаивает.

Есть ли способ :

  1. посмотреть, какой поток я на самом деле пытаюсь вызвать?
  2. посмотреть, что этот поток на самом деле делает?

На изображении ниже мы видим, что рабочий поток (ID 3732) заблокирован в строке Invoke, а MainThread простаивает в основной функции приложения.

alt text

Edit: Вот стек основного потока:

alt text

Edit2: Фактически, я приостановил программу во второй раз, и вот как выглядит стек например:

alt text

Edit3: Обходной путь найден

Я наконец нашел обходной путь. Проблема, по-видимому, связана с гонкой асинхронной оболочки рабочий поток заблокирован в строке вызова:

return (ucAvancementTrtFamille)mInterfaceTraitement.Invoke(d, new object[] { psFamille });

Странно то, что поток пользовательского интерфейса (который, поправьте меня, если я ошибаюсь, является основным потоком) бездействует.

Есть ли способ:

  1. посмотреть, какой поток я на самом деле пытаюсь вызвать?
  2. увидеть, что этот поток на самом деле делает?

Мы можем видеть на изображении ниже рабочий поток (ID 3732), заблокированный в строке Invoke, и MainThread простаивает в основной функции приложения.

alt text

Edit: Вот стек основного потока:

alt text

Edit2: На самом деле, я приостановил программу во второй раз, и вот как выглядит стек:

alt text

Edit3: Обходной путь найден

Я наконец нашел обходной путь. Проблема, по-видимому, связана с гонкой асинхронной оболочки рабочий поток заблокирован в строке вызова:

return (ucAvancementTrtFamille)mInterfaceTraitement.Invoke(d, new object[] { psFamille });

Странно то, что поток пользовательского интерфейса (который, поправьте меня, если я ошибаюсь, является основным потоком) бездействует.

Есть ли способ:

  1. посмотреть, какой поток я на самом деле пытаюсь вызвать?
  2. увидеть, что этот поток на самом деле делает?

Мы можем видеть на изображении ниже рабочий поток (ID 3732), заблокированный в строке Invoke, и MainThread простаивает в основной функции приложения.

alt text

Edit: Вот стек основного потока:

alt text

Edit2: На самом деле, я приостановил программу во второй раз, и вот как выглядит стек:

alt text

Edit3: Обходной путь найден

Я наконец нашел обходной путь. Проблема, по-видимому, связана с гонкой асинхронной оболочки

Есть ли способ:

  1. увидеть, какой поток я на самом деле пытаюсь вызвать?
  2. увидеть, что этот поток действительно делает?

На изображении ниже мы можем видеть рабочий поток (ID 3732) заблокирован в строке Invoke, и MainThread простаивает в основной функции приложения.

alt text

Edit: Вот стек основного потока:

alt text

Edit2: Фактически, я приостановил программу во второй раз , и вот как выглядит стек:

alt text

Edit3: Обходной путь найден

Наконец-то я нашел обходной путь. Проблема, по-видимому, связана с гонкой асинхронной оболочки

Есть ли способ:

  1. увидеть, какой поток я на самом деле пытаюсь вызвать?
  2. увидеть, что этот поток действительно делает?

На изображении ниже мы можем видеть рабочий поток (ID 3732) заблокирован в строке Invoke, и MainThread простаивает в основной функции приложения.

alt text

Edit: Вот стек основного потока:

alt text

Edit2: Фактически, я приостановил программу во второй раз , и вот как выглядит стек:

alt text

Edit3: Обходной путь найден

Наконец-то я нашел обходной путь. Проблема, по-видимому, связана с гонкой асинхронной оболочки Вот стек основного потока:

alt text

Edit2: На самом деле, я приостановил программу во второй раз, и вот как выглядит стек:

alt text

Edit3: Обходной путь найден

Я наконец нашел обходной путь. Проблема, по-видимому, связана с гонкой асинхронной оболочки Вот стек основного потока:

alt text

Edit2: На самом деле, я приостановил программу во второй раз, и вот как выглядит стек:

alt text

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);

Это некрасиво, но это единственное решение, которое я нашел.

11
задан svick 15 September 2013 в 18:24
поделиться