【问题标题】:Turn over a byte[] from Method A to Method B将方法 A 中的一个 byte[] 转给方法 B
【发布时间】:2013-10-10 19:50:55
【问题描述】:

我有两种方法,prepareData()sendData()

    private void prepareData(string longFileName, string shortFileName)
    {
        try
        {
            byte[] fileNameByte = Encoding.ASCII.GetBytes(shortFileName);
            byte[] fileData = File.ReadAllBytes(longFileName);
            byte[] clientData = new byte[4 + fileNameByte.Length + fileData.Length];
            byte[] fileNameLen = BitConverter.GetBytes(fileNameByte.Length);
            fileNameLen.CopyTo(clientData, 0);
            fileNameByte.CopyTo(clientData, 4);
            fileData.CopyTo(clientData, 4 + fileNameByte.Length);
        }
        catch
        {
        }
    }

    private void sendData(string clientIP, int clientPort, byte[] clientData)
    {
            TcpClient clientSocket = new TcpClient(clientIP, clientPort);
            NetworkStream networkStream = clientSocket.GetStream();
            networkStream.Write(clientData, 0, clientData.GetLength(0));
            networkStream.Close();
            clientSocket.Close();
    }

prepareData()在程序加载时被调用;这是一项艰巨的任务。

sendData() 每隔几秒调用一次,应该从prepareData() 发送byte[] clientData

如何将byte[]从第一种方法获取到第二种方法?

【问题讨论】:

  • byte[]sendData 发送什么?
  • 不明白。您是说您希望 senddata 发送创建的字节数组,然后在preparedata 中丢弃吗?或preparedata来调用senddata,或者完全是别的东西。
  • 所以你在程序开始时将clientData存储在一个局部变量中,每隔几秒发送一次,但问题出在哪里?
  • 问题是,当我想在 sendData 中发送它时,字节数组 clientData 是空的......它在 prepareData 中没有 byte[] clientData 的值

标签: c# byte bytearray


【解决方案1】:

如前所述,问题在于您将 clientData 存储在一个局部变量中,当您退出 prepareData 时该变量会被丢弃。您的 clientData 必须要么存储在类变量中,要么从 prepareData 返回。尝试做这样的事情:

private byte[] prepareData(string longFileName, string shortFileName)
{
    try
    {
        byte[] fileNameByte = Encoding.ASCII.GetBytes(shortFileName);
        byte[] fileData = File.ReadAllBytes(longFileName);
        byte[] clientData = new byte[4 + fileNameByte.Length + fileData.Length];
        byte[] fileNameLen = BitConverter.GetBytes(fileNameByte.Length);
        fileNameLen.CopyTo(clientData, 0);
        fileNameByte.CopyTo(clientData, 4);
        fileData.CopyTo(clientData, 4 + fileNameByte.Length);
        return clientData;
    }
    catch
    {
    }
}

private void sendData(string clientIP, int clientPort, byte[] clientData)
{
    TcpClient clientSocket = new TcpClient(clientIP, clientPort);
    NetworkStream networkStream = clientSocket.GetStream();
    networkStream.Write(clientData, 0, clientData.GetLength(0));
    networkStream.Close();
    clientSocket.Close();
}

如果你这样做,你不需要一个定时器来调用 sendData 方法;只需在 prepareData 完成后调用它,如下所示:

    var clientData = prepareData("longFileName", "shortFileName");
    sendData(clientData);

如果 prepareData 确实是一项繁重的任务,您应该让一些线程运行并在一个线程中读取文件块,使用 ConcurrentQueue(如@dweeberly 建议的那样)将它们存储在其中,并使用另一个线程调用 sendData。

【讨论】:

  • 顺便说一句,这是生产者-消费者模式。
【解决方案2】:

我也不确定问题是什么,但我将如何解决您的问题:

添加这个使用指令

using System.Timers;

并在您的 Class 中使用 prepareData 和 sendData-Method 添加一个 Timer 作为字段:

private Timer scheduler;

添加一个 StartSending-Method:

private void StartSending(byte[] clientData) {
    double interval = 2000; // 2000ms = 2s
    scheduler = new Timer(interval);
    scheduler.Elapsed += (sender, e) => {
        sendData("someIp", 123, clientData);
    };
    scheduler.Start();
}

在您的 clientData 准备好后立即调用此方法。 如果这对您没有帮助,请澄清您的问题。

【讨论】:

    【解决方案3】:

    我猜您正在尝试以与时间无关的方式在您的类的两个方法之间共享数据。您需要根据您的示例创建一个类全局结构,例如:

    ConcurrentQueue<byte[]> clientData = new ConcurrentQueue<byte[]>()
    

    在您的 prepareData 方法中将数据入队并在 sendData 中尝试出队数据

    【讨论】:

    • 这是个好主意...但是:
    • 这是我准备数据的代码: ConcurrentQueue clientDataQueue = new ConcurrentQueue(); clientDataQueue.Enqueue(clientData);
    • And for SendData private void sendData(string clientIP, int clientPort, ConcurrentQueue clientDataQueue) { byte[] clientData; clientDataQueue.TryDequeue(out clientData);
    • 但是没有用...如果他想在网络流中写入客户端数据,他会抛出异常
    • 你不需要绕过队列。队列是并发的,因此您可以将其用作全局变量。抛出了什么异常。
    猜你喜欢
    • 1970-01-01
    • 2013-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-26
    • 2019-11-06
    • 2012-07-31
    • 2015-05-17
    相关资源
    最近更新 更多