В качестве аргумента рассмотрим поток пользовательского интерфейса как поток, которому был вызван Application.Run()
или вызвана одна из его перегрузок, и запущен активный цикл обработки сообщений.
Есть ли способ определить, выполняем ли мы в данный момент такой поток?
Причина, по которой я этого хочу, в том, что у меня есть класс с закрытой функцией, которая работает долго. Сам класс уже многопоточный, и использование этого класса таково, что его можно использовать либо из пользовательского интерфейса, либо из фоновых потоков, выполняющих обработку. Эта функция также попадает в эту сеть. Но я не хочу, чтобы это блокировало поток пользовательского интерфейса. Поэтому я хочу определить, запущен ли я в потоке пользовательского интерфейса и, если это так, раскошелиться на вызов функции в фоновом потоке (вероятно, ThreadPool
, но это не проблема для этого обсуждения). Это вполне корректно, но фоновые потоки, вероятно, полагаются на выходные данные функции, поэтому блокировка для них лучше, в то время как поток пользовательского интерфейса обращается к ней более «установил и забыл».