c# - 如何同步这些线程以避免数据损坏?

标签 c# multithreading

TL;DR 版本:我有两个线程。其中一个线程可能需要 Interrupt() 另一个线程,但前提是另一个线程正在处理与受第一个线程影响的对象相关的数据。如何根据某些条件仅 Interrupt() 第二个线程。

我一直在开发一个程序,该程序启动两个线程来处理套接字数据并使用信息更新 GUI。这两个线程(topologyThread 和 dataThread)处理我的应用程序的两个不同方面,即无线传感器网络的拓扑更改通知,以及用于接收和处理来自无线传感器网络的数据的数据信息。

当数据进入 dataThread 时,数据包所代表的网络成员可能已被 TopologyThread 删除,因此不应被处理。因此,我认为使用 Thread.Interrupt() 方法可以让我立即通知 dataThread 拓扑的更改,并防止我们在尝试使用网络成员的数据更新 GUI 时遇到的一些问题。不再连接。我的问题是:如何判断 dataThread 是否需要中断?我不希望它在处理仍然连接的网络成员的数据时抛出异常,但我希望它在处理随后断开连接的网络成员的数据时被中断。

场景1:

  • 数据来自 dataThread。
  • dataThread 确保网络成员仍然是网络的一部分。
  • dataThread处理数据到底并更新GUI

场景 2:

  • 数据来自 dataThread。
  • dataThread 确保网络成员仍然是网络的一部分。
  • 网络成员已断开连接,因此不会进行任何处理。

场景 3:

  • 数据来自 dataThread。
  • dataThread 确保网络成员仍然是网络的一部分。
  • dataThread开始处理数据
  • topologyThread 收到网络成员已断开连接的通知,并将其从拓扑中删除。
  • dataThread 尝试为不再连接的网络成员更新 GUI。

我正在尝试编写场景 3。在我们的测试中,这种情况是侧边栏中的 TreeView 卡住并且应用程序必须被终止。但如果受topologyThread影响的对象是dataThread当前正在作用的对象,我只需要中断dataThread。

感谢您的阅读。 :)

最佳答案

您不应该中断您的线程。使用 EventWaitHandles 进行编程可能会更安全,EventWaitHandles 可以根据您想要实现的目标触发信号。

关于c# - 如何同步这些线程以避免数据损坏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/553737/

相关文章:

c# - Asp.NET 实时游戏

c# - 我如何创建两个部分来重点关注和其他部分进行写作?

java - 如何为有意义的相等对象创建线程锁/同步并防止各个线程的并行执行?

c# - Response.Redirect 与查询字符串

c# - AngularJS .Net WebAPI 上传图片并保存到数据库(MSSQL)

c# - 如何从 Controller 调用 EditorFor

c# - Func<T>.BeginInvoke 是否使用线程池?

c# - 如何获得与 Thread.Sleep 支持 double 值类似的结果?

c++ - 将 cout 重定向到每个线程的文件以管理线程安全日志记录

java - java.lang.OutOfMemoryError : unable to create new native thread error using ChromeDriver and Chrome through Selenium in Spring boot