杀死一个陷入等待答案的线程

本文关键字:等待 答案 线程 一个 | 更新日期: 2023-09-27 18:37:16

我正在用 C# 编写一个程序,该程序与一个小的显示单元接口,该显示单元执行了一大堆与此问题无关的事情。

我遇到的问题详细说明如下:当用户选择一个按钮时,该按钮将尝试将某些设置保存到设备,它使用确认协议来确保设置已通过(意思是 - 它发送设置,然后等待来自设备的确认数据包。

我所做的是在我的主应用程序中生成一个线程,该线程将成为我将要生成的线程的"父"线程,该线程将尝试保存到设备。目前,它以下列方式工作:

  • 生成线程 1 -> 尝试保存。

  • 如果超时,则通过 Thread.Interrupt() 中断线程 1(释放设备的数据锁)<-----这就是问题所在>。这行不通。它会加粗锁,直到设备关闭或拔下插头,然后出错。 (然后它会生成一个新线程,现在发生,但它永远不会工作,因为第一个线程仍然锁定数据)。

  • 如果没有超时,线程 1 的回调会让父线程知道不再生成任何线程。

  • 最后,如果所有线程都没有成功,则整个尝试失败。

我还尝试只生成并关闭单个线程来执行此操作,这也表现出相同的行为,即在等待设备确认时,它会永久挂起,直到设备断电或拔下电源。

没有办法封装等待设备发送带有布尔值的确认,该布尔值可以设置为停止线程,因为它永远不会离开等待调用。 这是嵌入式软件,所以我无法修改等待功能。我只能修改嵌入式软件的 C# 接口。

杀死一个陷入等待答案的线程

您似乎在说您的线程 1 永远等待 ACK。 另一个线程检测到超时条件并尝试中断线程 1。 我建议线程 1 不应该永远等待,而应该在等待 ACK 时自行超时。 然后,线程 1 可以重试或退出并出现错误,并且不需要来自另一个线程的中断。

你应该使用 Thread.Abort 而不是 Interrupt。为了进一步澄清,请查看此线程中止与中断

这应该可以解决您的问题。