【问题标题】:filestream c# read data repeatedlyfilestream c# 重复读取数据
【发布时间】: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


【解决方案1】:

您没有使用Read 的返回值来找出您实际获得了多少字节。

【讨论】:

  • 它总是 ReceivedDataBuffer.Length (64) 或者它只是 0 在我的情况下只有这两个结果
  • 那么也许这是一个竞争条件。发送是异步的吗?无论如何,这里看不到错误,您需要发布更多代码。
  • 你在哪里我应该添加整个代码它是代码中的两个错误,现在已经在问题的 cmets 中解决了,谢谢
猜你喜欢
  • 2021-08-08
  • 2017-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-30
  • 2021-06-19
  • 2018-01-08
相关资源
最近更新 更多