c # Передать значение из дочернего потока в родительский поток, не выходя из дочернего потока - PullRequest
0 голосов
/ 25 октября 2019

У меня есть приложение Windows Forms, которое при запуске запускает новый поток с подключением к сокету, который прослушивает клиентов.

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

Это потому что:

  • Когда сокет получает значение, он вызывает обработчик событий и длинную цепочку методов после этого,Эти методы добавляют полученное значение к существующим структурам данных и изменяют пользовательский интерфейс.
  • Объект, к которому мне нужно добавить это значение, кажется, является нулевым в дочернем потоке. Поэтому я думаю, что вместо этого мне нужно передать значение обратно в родительский поток - без остановки дочернего потока.
  • Просто возвращение значения из потока не кажется решением, потому что это остановит сокет отвыполняется.

Как передать значение из дочернего потока в родительский поток без остановки дочернего потока?

Ответы [ 2 ]

0 голосов
/ 25 октября 2019

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

public class CommunicationsBlock {
   public AutoResetEvent ValueReady {get; set;}
   public object NewValue {get; set;}
}

(in parent)

var cb = new CommunicationsBlock {
   ValueReady = new AutoResetEvent(false)
};

var child = new Thread(ChildThread);
child.Start(cb);
while (true)
{
   if (cb.ValueReady.WaitOne(TimeSpan.FromMilliseconds(10)))
   {
      // We have a new value
   }
}

(child thread)
private static void ChildThread(object state)
{
   var cb = (CommunicationsBlock) state;
   while (true)
   {
      // some stuff
      if (readytosend)
      {
         cb.NewValue = new object();
         cb.ValueReady.Set();
      }
   }
}
0 голосов
/ 25 октября 2019

Назначить значение в static в дочернем потоке и извлечь его из основного потока

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