2009-12-30 93 views
0

使用VB.Net我添加了一个CTRL-C处理程序:控制台CTRL-C处理失败

AddHandler Console.CancelKeyPress, AddressOf QuitHandler 

后者执行以下步骤:

Private Sub QuitHandler(ByVal sender As Object, ByVal args As ConsoleCancelEventArgs) 

     Console.WriteLine("Quitting...") 
     args.Cancel = True 
     Quit = True 
    End Sub 

然后我有一个主循环只运行到Quit = True。

这一切工作,直到我开始从串口读取:

Private Sub port_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles Port.DataReceived 

此时CTRL-C处理程序获取忽略有关30secs此时控制台应用程序刚刚结束,而无需通过清理代码会。

为什么?

回答

0

我不知道VB,但我的猜测是你试图从串口读取数据不在那里(错误,端口在那里,数据不是);因此,您的程序正在阻塞(“悬挂”),直到读取尝试在30秒后超时。

如果我是正确的,你需要一些方法来轮询你的串行输入没有阻塞,或者(更好)当数据实际出现时调用异步子。

+0

port_DataReceived本身就是一个处理程序,所以当数据出现时它在不同的线程上运行,所以它不应该阻塞主线程。 CTRL-C一直工作到读取第一组数据为止,即如果在任何数据命中串口之前按CTRL-C,一切正常。 – Nicky 2009-12-30 12:03:53

+0

数据每10秒钟左右击中一次端口,因此在应用退出前接收并显示三到四个批次。 – Nicky 2009-12-30 12:05:54

+0

好的,我该放弃的时候了。我的猜测并没有帮助你。抱歉! – 2009-12-30 14:11:41

0

您应该确保了解Timeouts的工作方式,因为您正在读取池中的串行端口。您的串行线程将始终运行并尝试读取某些内容。

最好的方法是在数据可用时读取数据,然后串行线程有时间喘口气。

您也可以尝试使用DoEvents。