- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在一些与支付终端通信的遗留代码中发现了一个错误。
就在开始新的支付之前,代码尝试清除 SerialPort 的内部读取缓冲区。
我将代码精简到最低限度。它使用 .NET SerialPort 类型。设置了 50 毫秒的读取超时。然后它读取 512 个字节并继续这样做,直到不再读取任何字节或直到抛出 TimeoutException。
我们添加了一堆日志记录,它表明对第一个 Read(...) 方法的调用有时需要 10 - 15 分钟,即使超时为 50 毫秒。然后抛出 TimeoutException 并继续应用程序。但是在 Read(...) 期间应用程序挂起。
这并不总是会发生,Windows 2000 机器由于某种原因似乎更容易出现此错误。
public class Terminal
{
private SerialPort _serialPort = new SerialPort();
public void ClearReadBuffer()
{
try
{
_serialPort.ReadTimeout = 50;
int length;
do
{
var buffer = new byte[512];
length = _serialPort.Read(buffer, 0, 512);
} while (length > 0);
}
catch (TimeoutException) {}
}
}
感谢任何帮助。
PS:大多数错误报告来自 W2K 机器,其中设备连接到 EdgePort,模拟一组虚拟 COM 端口。它的驱动程序创建了一堆(8 个左右)本地 COM 端口。
但我们也有来自 Windows 7 的报告。如果我们直接将设备连接到 PC(没有 EdgePort),我们也可以重现该问题。但是不那么频繁,当它发生时,延迟不是 10 分钟,而是更像是 1 - 2 分钟。
更新:尝试了很多方法来解决这个问题。很难重现,但在现场经常发生,因为它分布在数千台 PC 上。实际上用另一个开源版本替换了 .NET 2.0 SerialPort 类型。在一台 PC 上正常工作,我们实际上可以在 60-70% 的时间内重现它。但遗憾的是,在生产中的试点测试期间,问题仍然继续出现。
支付终端的代码是几年前编写的,我将其移植到另一个应用程序中。在移植期间,我重构了一些代码,但保留了原来的功能。与终端通信时,代码将:
与此同时,主线程有一个 while 循环,其中包含一个 Thread.Sleep(50) 和一个 Application.DoEvents() 调用(糟糕!)。我从中重构了整个“等待循环”并使用了 WaitHandle (AutoResetEvent/ManualResetEvent)。我只是等到这个句柄被设置。工作没有问题,但在某些 PC 上,所有串行端口通信都会卡住几分钟,直到触发它。重新启用 Application.DoEvents() 的工作方式,问题就消失了。
不幸的是,它仍然在那里,这对我来说是一个谜,为什么这里需要它以及为什么它会导致如此严重的副作用。该应用程序支持 5 种其他类型的串行端口设备。与这些设备通信从来不需要这样的东西。
最佳答案
也许在端口的“要读取的字节数”上添加测试可能有助于避免编码错误的驱动程序:
length = (_serialPort.BytesToRead > 0) ? _serialPort.Read(buffer, 0, 512) : 0;
更好的是,使用
_serialPort.DiscardInBuffer();
相反!
关于c# - SerialPort.Read(....) 不遵守 ReadTimeOut,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11340513/
我看过一些与 Selenium 中的超时错误相关的帖子。这变得越来越难以忍受,因为它使我的测试包无法使用。我正在测试当前正在开发中的网页。 我有一个包含大约 300 个测试场景的回归套件,在 fire
我用过 httparty Rails 4 应用程序中的 gem 当我发布到 api 时,查询正在服务器中运行,但我的控制台因错误 Net::ReadTimeout: Net::ReadTimeout
我今天放假回来,我的 capybara 和 Selenium 动力测试抛出了这个错误: Net::ReadTimeout: Net::ReadTimeout /Users/pupeno/.rvm/ru
热衷于将 Capybara 烘焙到新版本的 Rails (5.1) cf http://weblog.rubyonrails.org/2017/2/23/Rails-5-1-beta1/ 我遇到了一个
我试图了解 restTemplate 上可用的 readTimeout,它到底是什么? 它是在我们收到超时异常之前请求可以花费的总时间吗? 最佳答案 您可以在 RestTemplate 上定义读取超时
对于我的测试服务器,我有无复制 Cassandra 2.1.6 设置: CREATE KEYSPACE v2 WITH replication ={'class': 'SimpleStrategy',
我有一个 Zuul 代理,它工作正常,直到它重定向到一个比正常时间(超过 10 秒)响应时间更长的服务器。 我可以通过属性 (zuul.host.socket-timeout-millis) 修改读取
我正在使用 Ruby/Cucumber/Capybara/Chromedriver 运行自动化测试。自动化测试由 Jenkins 运行。奇怪的是,有时浏览器打开,但黑屏,我得到 Net::ReadTi
我正在尝试使用 Python 和请求抓取 Home Depot 网站。 Selenium Webdriver 工作正常,但需要太多时间,因为目标是在本地油漆店和电动工具店之间制作一个对时间敏感的价格比
我们遇到一个问题,在我们产品的单个实例上,当我们尝试设置 System.Net.HttpWebResponse 对象的 ReadTimeout 属性时收到 InvalidOperationExcept
我在我的代码中使用了 URLConnection。我已将 ReadTimeout 设置为 5 秒,但它没有生效。当我关闭 wifi 时,会立即调用 IO 异常。 URLConnection conn
当客户端使用 readTimeout 关闭与 API 的连接时,服务器会发生什么。请求的执行将完成还是一旦超时发生就会中断,或者执行将完成并且响应流被服务器应该发送给用户的响应 最佳答案 超时是关闭连
我已经在 Virtual Box 上安装了 hortonworks 沙箱。 (6092MB 内存)我正在关注 this tutorial . 当我尝试执行一个简单的脚本时 使用参数:-useHCata
我正在使用 httparty 进行一系列 API 调用。前两个 API 调用成功,但第三个失败。它暂停大约 60 秒(默认超时时间),然后返回此错误: /Users/luigi/.rvm/rubies
在为这个简单问题找到答案所花费的时间似乎比合理的多得多之后,我想我应该将我的结果留在这里,这样其他人就不必跳过我刚刚遵循的所有障碍和错误路径。 问题是,如果您使用 TcpClient ReadTime
NetworkStream.ReadAsync 什么时候任务完成?一旦接收到指定长度的数据? 如果是,它会返回 0 吗?然后 CancellationToken可以用作 ReadTimeout ,这是
在一些与支付终端通信的遗留代码中发现了一个错误。 就在开始新的支付之前,代码尝试清除 SerialPort 的内部读取缓冲区。 我将代码精简到最低限度。它使用 .NET SerialPort 类型。设
在使用 Watir 进行身份验证后,我正在尝试使用 Watir 获取 Facebook 的源代码。它给出了这个特定的错误。 /.rvm/rubies/ruby-2.0.0-p247/lib/ruby/
我在以下代码中遇到异常: (System.IO.MemoryStream) Stream stream = new MemoryStream(fcr.FileContents); System.Dra
我对如何使用 ReadTimeout 以及它如何影响 Read() 感到困惑。 当尝试读取网络流时,有 3 种情况,假设我们正在尝试读取 X 个字节: 数据可用,字节 X 没有可用数据,ReadTim
我是一名优秀的程序员,十分优秀!