【问题标题】:c# Pass value from child thread to parent thread while not exiting child threadc#在不退出子线程的情况下将值从子线程传递给父线程
【发布时间】:2020-02-21 20:55:51
【问题描述】:

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

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

这是因为:

  • 当套接字接收到值时,它会调用一个事件处理程序,然后调用一长串方法。这些方法将接收到的值添加到现有数据结构并更改 UI。
  • 我需要添加此值的对象在子线程中似乎为空。所以我想我需要将值传递回父线程 - 而不停止子线程。
  • 仅从线程返回值似乎不是解决方案,因为这会阻止套接字运行。

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

【问题讨论】:

  • “我需要添加这个值的对象在子线程中似乎为空。所以我想我需要将值传递回父线程”我不太明白这种情况。为什么在主线程上创建的对象会在第二个线程中突然变成null?听起来问题出在其他地方
  • "如何在不停止子线程的情况下将值从子线程传递给父线程?"你可以使用一个事件。
  • 好的。那么不同的线程确实可以访问相同的对象实例吗?谢谢
  • “所以不同的线程确实可以访问相同的对象实例?” 是的,这就是为什么您可以获得Cross-thread operation not valid Exception
  • 我们找到了抛出跨线程异常的艰难方法,以避免人们在调用时吝啬:stackoverflow.com/a/14703806/3346583 |线程在您不知道原因的情况下停止的事实表明您的异常处理没有正确地公开线程的异常。这是一个严重的错误。我必须在我经常链接的那个问题上发表文章:blogs.msdn.microsoft.com/ericlippert/2008/09/10/… | codeproject.com/Articles/9538/…

标签: c# multithreading sockets


【解决方案1】:

在子线程中静态赋值并从主线程中获取

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2021-12-17
      • 1970-01-01
      • 1970-01-01
      • 2015-03-31
      • 1970-01-01
      • 2011-06-07
      • 1970-01-01
      • 2014-03-17
      • 1970-01-01
      相关资源
      最近更新 更多