Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c#在不退出子线程的情况下,将值从子线程传递到父线程_C#_Multithreading_Sockets - Fatal编程技术网

c#在不退出子线程的情况下,将值从子线程传递到父线程

c#在不退出子线程的情况下,将值从子线程传递到父线程,c#,multithreading,sockets,C#,Multithreading,Sockets,我有一个windows窗体应用程序,它在启动时启动一个带有套接字连接的新线程来侦听客户端 当这个套接字从客户端接收到一个值时,应该在主父线程上使用这个值,而子线程则继续运行这个套接字 这是因为: 当套接字接收到该值时,它调用一个eventhandler,然后调用一长串方法。这些方法将收到的值添加到现有数据结构中,并更改UI 我需要将此值添加到的对象在子线程中似乎为null。因此,我想我需要将值传递回父线程,而不停止子线程 仅仅从线程返回值似乎不是一个解决方案,因为这会阻止套接字运行 如何在不

我有一个windows窗体应用程序,它在启动时启动一个带有套接字连接的新线程来侦听客户端

当这个套接字从客户端接收到一个值时,应该在主父线程上使用这个值,而子线程则继续运行这个套接字

这是因为:

  • 当套接字接收到该值时,它调用一个eventhandler,然后调用一长串方法。这些方法将收到的值添加到现有数据结构中,并更改UI

  • 我需要将此值添加到的对象在子线程中似乎为null。因此,我想我需要将值传递回父线程,而不停止子线程
  • 仅仅从线程返回值似乎不是一个解决方案,因为这会阻止套接字运行

如何在不停止子线程的情况下将值从子线程传递到父线程?

在子线程中以静态方式分配值,并从主线程获取值

我过去这样做的方式是在启动时将要更改的变量传递给子线程,以及一个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();
      }
   }
}

“我需要将此值添加到的对象在子线程中似乎为空。因此我想我需要将该值传递回父线程。”我不太理解这种情况。为什么在主线程上创建的对象在第二个线程中突然变成
null
?这听起来像是其他地方的问题“如何在不停止子线程的情况下将值从子线程传递到父线程?”您可以使用event.ok。那么不同的线程确实可以访问相同的对象实例?感谢“那么不同的线程确实可以访问相同的对象实例?”是的,他们可以,这就是为什么你可以得到一个答案,我们找到了抛出跨线程异常的困难方法,以避免人们忽略调用:|事实上,线程在你不知道原因的情况下停止了,指示异常处理未正确公开线程的异常。这是一个严重的错误。我必须就我经常联系的问题向Artikles提问:|