Поиск методов, требующих InvokeRequired - PullRequest
1 голос
/ 11 июня 2009

Я прихожу к вам, чтобы узнать, есть ли у кого-то идея, как решить проблему, с которой я столкнулся при переходе на ActiveMQ. Я использую ActiveMQ для отправки уведомлений в рамках этого проекта (в C #), и после завершения реализации я обнаружил некоторые ошибки, связанные с проблемами многопоточности. ( Я знаю, что решением для этого исключения является использование «if this.InvokeRequired .... и т. Д.», Но мой вопрос:

Есть ли способ найти все методы, которые требуют этого вызова?

Конечно, я мог бы шаг за шагом проверять все события, вызванные уведомлениями, но, кроме того, что это заняло бы у меня слишком много времени, это не решило бы мои будущие ошибки программирования.

Я думаю, есть лучший способ выяснить это, но я не могу думать об этом прямо сейчас. Вы сталкивались с проблемой раньше?

Большое спасибо за помощь

Ответы [ 2 ]

3 голосов
/ 11 июня 2009

Нет. Не существует автоматического способа сделать это, если, конечно, вы не настроили тестовый проект с самого начала. В этом случае вы можете добавить некоторые условия для проверки правильности потока.

Программное обеспечение не может вывести то, что вы хотели, кроме как очень конкретными способами (например, FxCop и предупреждения IDE об определенных вещах). То, что вы написали, не обязательно означает, что вы хотели написать. Вы фактически запрашиваете программное обеспечение, которое может выяснить, что вы хотели сделать.

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

Вы сами должны это понять.

1 голос
/ 11 июня 2009

Не то чтобы определенные методы, которые вы вызываете, требуют вызова. Это зависит от того, из какого потока вы вызываете эти методы.

Если вы вызываете метод в приложении Winforms, в потоке, отличном от потока пользовательского интерфейса, он потребует Invoke.

В зависимости от кода должно быть легко проанализировать, какие вызовы сделаны из каких потоков, особенно если вы называете фоновые потоки (что всегда полезно). Но, вероятно, нет автоматического способа сделать это - просто отступите назад и посмотрите на свой код.

...