【发布时间】:2014-11-19 19:22:37
【问题描述】:
我正在使用带有文件句柄的文件流与 USB HID 设备通信 设备重新发送接收到的报告(字节 [64] 数组)。 接收方法发生在另一个线程中,该线程在读取报告时触发事件,,
每次尝试只发送一份“报告” 第一次尝试是好的,收到了 1 份报告,但是当我再次发送时,它读取了两次! (它在文件流中是否可用两次??) 在下一次尝试中,事件再次触发两次! 之后,它会在接下来的 3 次尝试中添加 3 次
attempt 1 1 report received
attempt 2 2 reports received
attempt 3 2 reports received
attempt 3 3 reports received
attempt 4 3 reports received
attempt 5 3 reports received
attempt 6 4 reports received
attempt 7 4 reports received
发送更多报告导致收到 4 份报告 这有什么合乎逻辑的描述吗?
代码:
private void WriteData(object Data)
{
byte[] data = Data as byte[];
int bytesSent = 0;
while (bytesSent < data.Length)
{
byte [] OutputReportBuffer = new byte[64];
for (int i = 0; i < OutputReportBuffer.Length; i++)
if (bytesSent < data.Length)
{
OutputReportBuffer[i] = data[bytesSent];
bytesSent++;
}
else OutputReportBuffer[i] = 0;
try
{
fileStream.Write(OutputReportBuffer, 0, OutputReportBuffer.Length);
fileStream.Flush();
}
catch///deducted code
}
}
在此处接收(读取数据时触发事件的单独线程)
private void ReadData()
{
while (true)
{
try
{
if (fileStream.Read(ReceivedDataBuffer, 0, ReceivedDataBuffer.Length) > 0)
{
_Context.Send(o =>
{
if (DataReceived != null)
DataReceived(this, new DataReceivedEventArgs(ReceivedDataBuffer));
}, null);
}
}
catch //deducted code
}
}
【问题讨论】:
-
请输入代码。可能,您没有评估 Read 的结果。
-
欢迎来到 StackOverflow!请参阅"Should questions include “tags” in their titles?",其中的共识是“不,他们不应该”。
-
一个疯狂的猜测是,每当
DataReceived被引发时,你都会在代码中的某个地方重新注册DataReceived处理程序。一次注册的处理程序不会在事件引发时自动取消注册,因此在第一次引发之后,第二次注册相同的处理程序。下一次发生的事件会被处理两次,因此您会得到结果。这与每次“接收”数据比以前多一次这一事实一致。 -
您如何计算发送和接收的报告数量?您应该在发送或接收时更改您的输出。然后检查你是否看到
sent, received, sent, received, received -
感谢大家的帮助,@Grx70 是对的,这是我自己的错误,因为在测试表单上我创建了一个按钮来连接、添加事件并多次写入注册句柄。谢谢大家,特别感谢 Grx70
标签: c# filestream