2012-08-23 93 views
5

我正在开发一个Windows窗体应用程序,对通过USB连接的设备执行少量操作。对于像读,写和其他所有操作,我们有一个自定义库。阻止阻塞的线程阻塞

写入操作在用户点击按钮时完成。

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

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

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

我正在使用C#编程。

+1

如果“自定义库”不提供*任何*意味着取消了失败的连接上阅读阻挡,你应该把它扔掉,并使用不同的东西,说实话。 – Clemens

+0

我知道....我希望我可以...但与C#的默认串行端口类的情况相同...如果将Timeout设置为Infinte,则读操作将卡在失败的连接上。 – Swanand

+0

你可以尝试关闭“句柄”,无论你试图读取什么...然后读取将被取消我应该猜测...和你的线程取决于它如何写入可能会退出。 –

回答

1

你的Read方法可能调用本地代码,所以线程无法中止。没有办法(至少我熟悉)放弃使用COM互操作的线程。你可以看看为什么Read方法阻塞线程在第一位。尝试在调用Read方法之前检查需求。

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

+0

在一个单独的过程中运行它是我正在考虑的。我也在想你可能可以在另一个应用程序域中运行危险代码,我认为你也许能​​够“在脑中投篮”,但是......它也遭遇了同样的失败,以便中止线程问题,请参阅: http://msdn.microsoft.com/en-us/library/system.appdomain.unload.aspx –

+0

感谢您的想法!但是如何在不同的进程中只运行一个线程?或者作为一个不同的进程运行一个函数? – Swanand

+0

您可以创建另一个应用程序来处理COM互操作(USB通信)并将该应用程序作为进程启动。然后,您可以通过Pipes与该进程进行通信http://msdn.microsoft.com/en-us/library/system.io.pipes.aspx –