Для аргументации рассмотрим поток пользовательского интерфейса как поток, который имел вызов Application.Run()
или один из его перегрузок, вызываемых на него, и имеет активный цикл сообщений.Как определить, находимся ли мы в потоке пользовательского интерфейса?
Есть ли способ обнаружить, выполняем ли мы в настоящее время такую цепочку?
Причина, по которой я хочу это, потому что у меня есть класс с частной функцией, которая работает долго. Сам класс уже многопоточен, и использование этого класса таково, что его можно использовать либо из пользовательского интерфейса, либо из фоновых потоков, выполняющих обработку. Эта функция также попадает в эту сеть. Но я не хочу, чтобы он блокировал поток пользовательского интерфейса. Поэтому я хочу определить, работает ли я в потоке пользовательского интерфейса, и если да, то перепрограммируйте вызов функции в фоновый поток (возможно, ThreadPool
, но это не проблема для этого обсуждения). Это вполне корректно, но фоновые потоки, вероятно, полагаются на выход функции, поэтому блокировка для них лучше, тогда как поток пользовательского интерфейса обращается к нему более «заново» и «забывает».
Startupthread не обязательно является нитью графического интерфейса пользователя или единственным потоком графического интерфейса пользователя. –
WRONG: InvokeRequired возвращает true, если на «другой поток, чем тот, который был создан элементом управления». –
@ Rico: Да, конечно. Я не могу поверить, что опечатка сидит там последние три года, и никто не замечает. Спасибо, что поймали его, я обновил ответ соответственно. –