MethodInvoker не работает [дубликат]

Нам нужны виртуальные методы для поддержки «Полиморфизма времени выполнения». Когда вы ссылаетесь на объект производного класса, используя указатель или ссылку на базовый класс, вы можете вызвать виртуальную функцию для этого объекта и выполнить версию функции производного класса.

1
задан Peter 25 October 2012 в 23:51
поделиться

2 ответа

Есть только одна причина, по которой вызов Control.Invoke () будет зависать. Или вызов BeginInvoke () не выполняет свою цель, то же самое. Это происходит, когда основной поток программы, поток пользовательского интерфейса, не занят и занят чем-то другим.

Что может быть «что-то еще» по всей карте. Самое худшее, что вы могли бы сделать, - это основной поток, ожидающий завершения рабочего потока. Это гарантированный тупик, если вы используете Invoke ().

Условие очень легко диагностировать, использовать Debug + Break All и Debug + Windows + Threads. Дважды щелкните главный поток и посмотрите окно «Стек вызовов». В верхней части трассировки стека должно указываться «Управляется коренным переходом», а ниже - FPushMessageLoop (). Если вы видите что-то еще, то вы нашли код, который вызывает тупик.

10
ответ дан Hans Passant 27 August 2018 в 02:38
поделиться

Вы используете Thread.Join, чтобы приостановить поток пользовательского интерфейса, пока не будет выполнен другой поток. В то же время вы используете Control.Invoke, чтобы поток пользовательского интерфейса выполнял некоторые действия. Это не сработает, потому что поток пользовательского интерфейса ожидает завершения другого потока.

Я бы предложил вам либо удалить вызов Thread.Join, либо выполнить свое действие в потоке пользовательского интерфейса, если вы хотите, чтобы он подождал для завершения действия.

1
ответ дан Jan-Peter Vos 27 August 2018 в 02:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: