Как смоделировать Control.Invoke () в двух потоках без пользовательского интерфейса - PullRequest
1 голос
/ 21 июля 2011
  1. Предположим, есть поток A, который является потоком пользовательского интерфейса.
  2. Поток A создает другой поток B, который не является потоком пользовательского интерфейса.
  3. Когда поток B хочет вызвать событие в потоке A, все, что ему нужно сделать, - это если (Form1.InvokeRequired) Form1.Вызывать (тот же метод) и вызывать событие в том же методе, верно?

Простой.Но мой вопрос в том, что если вы хотите сделать то же самое, если и A, и B не являются пользовательскими потоками?Отсутствует объект формы для вызова Invoke () из потока B.

Если приложения WinForms делают это, почему нет такого механизма для потоков не-пользовательского интерфейса?Я что-то пропустил?Существует ли подобный метод для вызова события в одном не-пользовательском потоке из другого не-пользовательского потока?

Заранее спасибо.

PS Ответы модели производителя / потребителя не те, которые яищу здесь.

Ответы [ 2 ]

1 голос
/ 21 июля 2011

Если пользовательский интерфейс отсутствует, не возникает проблема перекрестного потока. Так что просто позвоните им из ветки. Вам может потребоваться какой-то механизм синхронизации.

1 голос
/ 21 июля 2011

В первом сценарии, поскольку поток B знает , что это не поток пользовательского интерфейса, он может просто вызвать .Invoke(...).

При наличии двух потоков, не относящихся к пользовательскому интерфейсу, вам придется использовать какую-то передачу / очередь сообщений. Вы не можете просто прервать поток A, чтобы запустить работу; Вы должны закодировать поток A, чтобы (например) проверить очередь на работу, снять элемент с очереди и выполнить его. Что в значительной степени и делает winforms, благодаря циклу сообщений Windows. Неважно, если это не ответ, который вы ищете - это то, что он есть.

...