什么阻止我的事件处理程序方法完成?

时间:2015-06-12 20:19:13

标签: c# wpf concurrency exception-handling event-handling

我正在使用SerialPort,WPF作为用户界面,使用'ui'对象来处理应用程序逻辑,以及使用SerialPort的包装器。

当触发SerialPort.DataReceived事件时,将调用相关方法。它开始运行,然后在阅读数据后,似乎退出,即使它还有更多的事要做。

它似乎没有抛出任何异常,它不会像它被卡在循环中一样(同步读取应该超时+我会得到大量的“我读了一件事”),而且我我很难过。几乎所有的GiveFeedback调用都是我尝试调试正在进行的操作的结果,因为我无法在我正在编写的机器上进行测试。

'ui'符号是指在调用GiveFeedback(字符串)时触发事件的对象,最终通过调用Dispatcher.BeginInvoke(stuff)来更新文本框的内容。

以下是完整的代码:

$('a.feature_thumb').click(function(){
    $('.' + this.id).addClass('your-class');
});

我不知道发生了什么,我找不到任何可以帮助我的资源。我试过没有任何尝试/捕获运行它,看看它是否投掷了一些奇怪的东西,我尝试用特定的异常捕获运行它,我已经尝试了我能想到的所有事情并且知道要做。

为什么它没有一直运行,我该如何解决?即使你有一个有助于调试的想法,我也很乐意听到它!请堆栈溢出,你是我唯一的希望!

1 个答案:

答案 0 :(得分:2)

这里有很多可能性......

首先,将数据放入串行缓冲区时会触发SerialDataReceivedEvent。这并不意味着整个消息可用,只是串行端口对象具有来自底层流的缓冲字节。然后,您使用while循环读取字节,直到获得-1。

ReadByte方法表示如果已读取流的末尾,则返回 -1 。这需要仔细解密,因为流的结尾实际上是Eof字符,不一定表示不再接收任何数据。

除此之外,您正在捕捉异常,我假设您可以告诉读取超时的时间。如果您设置了非常非常大的超时,或者将其保留为默认SerialPort.InfiniteTimeout,那么您将永远不会抛出此异常。

最后,当数据被读入缓冲区时会引发事件,并且这并不是说事件不能被多次引发。因此,例如,当您收到10个字节时,它可能会引发事件,当您循环访问数据时,它可能会再次引发它,创建处理程序的另一个实例,然后相互争用数据。

我会仅使用该事件来发信号通知另一个线程来读取数据。如果另一个线程已经在阅读它,那么它就不会做任何事情。线程应该在它失去工作时暂停。您还应该检查SerialPort.BytesToRead属性以确定是否有更多数据,请参阅https://msdn.microsoft.com/en-us/library/system.io.ports.serialport.bytestoread(v=vs.110).aspx我也不确定为什么要在逐个字节循环时才能调用{ {1}}获取一次通话中可用的所有内容......?