0

我有两种方法,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()每隔几秒调用一次,应该发送byte[] clientDatafrom prepareData()

我如何byte[]从第一种方法到第二种方法?

4

3 回答 3

0

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

添加这个使用指令

using System.Timers;

并在您的带有 prepareData 和 sendData-Method 的类中添加一个 Timer 作为字段:

private Timer scheduler;

添加一个 StartSending 方法:

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 准备好了,就调用这个方法。如果这对您没有帮助,请澄清您的问题。

于 2013-10-10T20:29:47.077 回答
0

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

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

将您的 prepareData 方法中的数据排入队列,并 TryDequeue 将 sendData 中的数据排入队列

于 2013-10-10T20:55:03.533 回答
0

如前所述,问题在于您将 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。

于 2013-10-10T21:17:17.263 回答