События C# между потоками, выполняемыми в их собственном потоке (Как к)?

Я хотел бы иметь два Потока. Давайте назовем их:

  • Поток A
  • Поток B

Распараллельте огни событие и распараллельте B, слушают это событие. Когда Поток B Слушатель События выполняется, он выполняется с идентификатором потока A Потока, таким образом, я предполагаю, что он выполняется в Потоке A.

То, что я хотел бы сделать, быть в состоянии запустить событие для Поточной обработки B высказывание чего-то как: "эй, данные готовы к Вам, можно иметь дело с ними теперь". Это событие должно быть выполнено в его собственном Потоке, потому что оно использует вещи, которые только его могут получить доступ (как средства управления UI).

Как я могу сделать это?

Спасибо за Вас справка.

17
задан Guillaume 8 March 2010 в 19:12
поделиться

3 ответа

Вам нужно будет передать информацию обратно в поток пользовательского интерфейса.

Обычно это делается в обработчике событий. Например, допустим, поток 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...
            }));
}
12
ответ дан 30 November 2019 в 12:58
поделиться

Самым простым способом, вероятно, является подписка с помощью обработчика событий, который просто передает "настоящий" вызов обработчика на поток B. Например, обработчик может вызвать Control.BeginInvoke для выполнения некоторой работы на потоке B:

MethodInvoker realAction = UpdateTextBox;
foo.SomeEvent += (sender, args) => textBox.BeginInvoke(realAction);

...

private void UpdateTextBox()
{
    // Do your real work here
}
9
ответ дан 30 November 2019 в 12:58
поделиться

Если вы используете Windows Forms или WPF и у вас нет под рукой ссылки на элемент управления из обработчиков событий, вы также можете записать ссылку на System.Threading.SynchronizationContext.Current во что-то, что выполняется в потоке пользовательского интерфейса, и предоставьте эту ссылку своим обработчикам событий.

Затем, когда вам нужно запустить что-то в потоке пользовательского интерфейса, вызовите Post () или Send () для захваченной ссылки SynchronizationContext из вашего обработчик событий, в зависимости от того, хотите ли вы, чтобы он запускался асинхронно или синхронно.

По сути, это просто сахар для захвата ссылки Control и вызова для нее Invoke () , но это может упростить ваш код.

3
ответ дан 30 November 2019 в 12:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: