Когда я должен проверять наличие InvokeRequired при вызове другого объекта потоков? - PullRequest
1 голос
/ 01 апреля 2011

В основной форме я создаю объект, который использует файловый ввод-вывод и сохраняет открытый дескриптор.Затем я создаю поток, который создает другую форму, которая должна использовать этот же объект.Конструктор второй формы принимает ссылку на объект IO первой формы.Стоит ли проверять RequireInvoke при вызове методов этого объекта ввода-вывода во второй форме, даже если указанный объект не связан с управлением пользовательским интерфейсом?

Ответы [ 2 ]

1 голос
/ 01 апреля 2011

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

Если вы спросите меня, более неотложной вещью будет достоверность данных, когда ониделится между потоками.Межпотоковые исключения доступа довольно просто найти и разрешить.

0 голосов
/ 01 апреля 2011

Итак, у вас есть два потока пользовательского интерфейса, оба из которых обращаются к объекту.

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

bool InvokeRequired
{
   // vastly simplified
   get { return GetCurrentThreadId() != GetWindowThreadId(this.Handle); }
}

Так почему это важно? Поскольку окна Windows (элементы управления и т. Д.) Могут безопасно отправлять сообщения только из того потока, который их создал. Они по своей природе не являются поточно-ориентированными. Изменение свойств элементов управления обычно требует отправки сообщений.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...