Я хотел бы иметь два Потока. Давайте назовем их:
Распараллельте огни событие и распараллельте B, слушают это событие. Когда Поток B Слушатель События выполняется, он выполняется с идентификатором потока A Потока, таким образом, я предполагаю, что он выполняется в Потоке A.
То, что я хотел бы сделать, быть в состоянии запустить событие для Поточной обработки B высказывание чего-то как: "эй, данные готовы к Вам, можно иметь дело с ними теперь". Это событие должно быть выполнено в его собственном Потоке, потому что оно использует вещи, которые только его могут получить доступ (как средства управления UI).
Как я могу сделать это?
Спасибо за Вас справка.
Вам нужно будет передать информацию обратно в поток пользовательского интерфейса.
Обычно это делается в обработчике событий. Например, допустим, поток A был вашим потоком UI - когда он подписался на событие объекта в потоке B, обработчик события будет запущен в потоке B. Однако затем он может просто передать эту информацию обратно в поток UI:
// In Thread A (UI) class...
private void myThreadBObject_EventHandler(object sender, EventArgs e)
{
this.button1.BeginInvoke( new Action(
() =>
{
// Put your "work" here, and it will happen on the UI thread...
}));
}
Самым простым способом, вероятно, является подписка с помощью обработчика событий, который просто передает "настоящий" вызов обработчика на поток B. Например, обработчик может вызвать Control.BeginInvoke
для выполнения некоторой работы на потоке B:
MethodInvoker realAction = UpdateTextBox;
foo.SomeEvent += (sender, args) => textBox.BeginInvoke(realAction);
...
private void UpdateTextBox()
{
// Do your real work here
}
Если вы используете Windows Forms или WPF и у вас нет под рукой ссылки на элемент управления из обработчиков событий, вы также можете записать ссылку на System.Threading.SynchronizationContext.Current во что-то, что выполняется в потоке пользовательского интерфейса, и предоставьте эту ссылку своим обработчикам событий.
Затем, когда вам нужно запустить что-то в потоке пользовательского интерфейса, вызовите Post () или Send () для захваченной ссылки SynchronizationContext из вашего обработчик событий, в зависимости от того, хотите ли вы, чтобы он запускался асинхронно или синхронно.
По сути, это просто сахар для захвата ссылки Control и вызова для нее Invoke () , но это может упростить ваш код.