2012-02-13 2 views
1

Требование о том, чтобы все .net-элементы управления были созданы в основном потоке, по крайней мере это необходимо, если целью является интеграция элемента управления с интерфейсом, который обычно имеет место , Кроме того, чтобы изменять свойства элемента управления, необходимо вызвать метод из потока элемента управления, используя его собственный метод invoke.Как программно можно найти собственный поток управления

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

Дополнительно или, наоборот, можно ли определить, является ли текущий поток «основной нитью»? Есть ли что-то особенное в потоке, который Visual Studio определяет как основной поток, который можно увидеть во время выполнения, или просто это первый поток, который VS выполняет для инициализации отладки?

ответ

5

Дополнительно или, наоборот, можно ли определить, является ли текущий поток «основным потоком»?

Вы можете использовать Control.InvokeRequired, чтобы узнать, есть ли соответствующая тема. Если вы этого не сделаете, то вы должны использовать Control.Invoke или Control.BeginInvoke, чтобы перевести вызов обратно на принадлежащий поток.

Есть ли что-то особенное в потоке, который Visual Studio определяет как основной поток, который можно увидеть во время выполнения, или просто это первый поток, который VS выполняет для инициализации отладки?

Это фактически поток, который используется для создания SynchronizationContext, который обрабатывает насос Windows Message. Эта резьба будет (или должна) всегда маркироваться как поток STA (см. Thread.ApartmentState) и иметь соответствующий контекст синхронизации и насос сообщений. Метод Application.Run устанавливает это в основном потоке в обычном приложении Windows Forms.

+0

+1 Это - но более того, если вам действительно нужно, вы можете сделать 'Control.Invoke (<Делегат/Лямбда, который отмечает текущий поток>)' - Но я вижу мало пользы. – Basic

+0

Я использовал InvokeRequired, однако, как отметили некоторые, это не сработает до тех пор, пока не будет создан дескриптор элемента управления. Похоже, что собственный поток определен конкретно как поток, ответственный за вызов CreateHandle(). Вопрос по-прежнему остается открытым в отношении того, где сохраняется взаимосвязь между элементом управления и его нитью, и можно ли это отношение увидеть программно. –

+1

@JCollins Нет прямого способа доступа к этому, кроме InvokeRequired. Внутри используется метод GetWindowThreadProcessId (http://msdn.microsoft.com/en-us/library/windows/desktop/ms633522(v=vs.85).aspx), чтобы получить поток, который «владеет» внутренним HWND (Control .Handle), а затем использует GetCurrentThreadId (http://msdn.microsoft.com/en-us/library/windows/desktop/ms683183(v=vs.85).aspx), чтобы проверить, чтобы исполняемый поток был тот же поток. Ни один из этих методов не отображается непосредственно в управляемом коде. –

Смежные вопросы