将一个字节 [] 从方法 A 转到方法 B

本文关键字:方法 字节 一个 | 更新日期: 2023-09-27 18:34:45

我有两个方法,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[]到第二种方法?

将一个字节 [] 从方法 A 转到方法 B

如前所述,问题在于您将clientData存储在一个局部变量中,当您退出prepareData时,该变量会被丢弃。您的客户端数据必须存储在类变量中,或者从 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。

我也不确定问题是什么,但这是我解决您的问题的方法:

添加此使用指令

using System.Timers;

并在您的类中使用 prepareData 和 sendData-Method 添加一个计时器作为字段:

private Timer scheduler;

添加启动发送方法:

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

一旦客户端数据准备就绪,请立即调用此方法。如果这对您没有帮助,请澄清您的问题。

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

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

在 prepareData 方法中对数据进行排队,并在 sendData 中尝试取消排队