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

Posted

技术标签:

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

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

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

这是因为:

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

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

【问题讨论】:

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

【讨论】:

以上是关于c#在不退出子线程的情况下将值从子线程传递给父线程的主要内容,如果未能解决你的问题,请参考以下文章

如何在不调用事件的情况下将数据从子级发送到父级(vue 2)

为啥我在实现委托以将值从子 swift 类传递给父目标 C 类时出错?

如何将值从子窗体传递回父窗体?

在 Kotlin Native 中,如何在不使用 C 指针的情况下将对象保留在单独的线程中,并从任何其他线程中改变其状态?

如何在不破坏 UI 的情况下将搜索放在另一个线程中?

是否可以在不使用 LoadLibrary 的情况下将函数“复制”到另一个进程中并在线程中执行它?