将一个字节 [] 从方法 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[]
到第二种方法?
如前所述,问题在于您将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 中尝试取消排队