【问题标题】:Stop a thread stuck at a blocking call停止阻塞调用的线程
【发布时间】:2012-08-24 03:04:23
【问题描述】:

我正在开发一个 Windows 窗体应用程序,以便在通过 USB 连接的设备上执行一些操作。对于读取、写入等所有操作,我们有一个自定义库。

当用户点击一个按钮时,写操作就完成了。

要阅读,会创建一个单独的线程。可用库的问题是读取调用被阻塞并且具有无限超时。

在连接失败的情况下,这个线程卡在读取函数调用,因为这个函数只有在它接收到数据时才会中断。

在这种情况下杀死这个线程的方法是什么? Thread.Abort() 不起作用。

我正在使用 C# 进行此编程。

【问题讨论】:

  • 如果“自定义库”没有提供 any 方法来取消对失败连接的阻塞读取,您应该将其丢弃并使用不同的东西,老实说。跨度>
  • 我知道....我希望我能...但是 C# 的默认串行端口类也是如此...如果我将 Timeout 设置为 Infinte,读取操作将停留在失败的连接上.
  • 您可以尝试将“句柄”关闭到您尝试从中读取的任何内容...然后读取将被取消我应该猜...并且您的线程取决于它的写入方式可能会退出。

标签: c# winforms thread-safety blocking


【解决方案1】:

您的 Read 方法可能会调用本机代码,因此线程无法中止。没有办法(至少我熟悉)中止使用 COM 互操作的线程。你可以先看看为什么 Read 方法会阻塞线程。在调用 Read 方法之前尝试检查需求。

看看这个问题:Abort call to unmanaged DLL

【讨论】:

  • 我正在考虑在一个单独的进程中运行它。我还认为您可能能够在另一个应用程序域中运行危险代码,我认为您也可能能够“在头脑中射击”,但是......它遭受同样的失败中止线程问题请参阅: msdn.microsoft.com/en-us/library/system.appdomain.unload.aspx
  • 感谢您的建议!但是如何在不同的进程中只运行一个线程呢?或者将函数作为不同的进程运行??
  • 您可以创建另一个处理 COM 互操作(usb 通信)的应用程序并将该应用程序作为进程启动。然后,您可以通过 Pipes msdn.microsoft.com/en-us/library/system.io.pipes.aspx 与该进程通信
猜你喜欢
  • 1970-01-01
  • 2013-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-16
  • 2011-12-24
  • 2019-09-02
  • 2018-01-28
相关资源
最近更新 更多