我有两种方法,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[] clientData
发送prepareData()
。
如何从第一种方法到第二种方法获得byte[]
?
答案 0 :(得分:0)
我也不确定问题是什么,但这是我如何解决你的问题:
添加此using-directive
using System.Timers;
并在您的类中使用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准备就绪后立即调用此方法。 如果这对您没有帮助,请澄清您的问题。
答案 1 :(得分:0)
我猜你试图以独立于时间的方式在你的班级的两种方法之间共享数据。您需要根据您的示例创建一个类全局结构:
ConcurrentQueue<byte[]> clientData = new ConcurrentQueue<byte[]>()
将数据排入prepareData方法并在sendData
中尝试取消数据答案 2 :(得分: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);
OR
如果prepareData确实是一项繁重的任务,你应该让一些线程进入并在一个线程中读取文件块,使用ConcurrentQueue(由@dweeberly建议)存储它们,另一个线程调用sendData。