最早用队列来暂存数据,按时间节点进行一次性读取和FTP传输,但是队列取数据实在是太慢了,所以重新用内存流来解决数据的性能问题,另一方面也是为了进行数据的无缝FTP上传。
1、先建立一个内存流MemoryStream,并建立它的StreamWriter
MemoryStream data_stream = new MemoryStream();
StreamWriter data_writer = new StreamWriter(data_stream);
2、一个加锁的内存流写入线程函数
int data_enqueue(string data)
{
lock (data_monitor)
{
try
{
data_writer.WriteLine(data);
data_writer.Flush();
return 1;
}
catch (Exception ex)
{
Class_log.err_write("[data_enqueue]" + ex.Message);
return 0;
}
}
}
3、FTP连接并将内存流数据直接写入FTP流
FtpWebRequest ftp = (FtpWebRequest)FtpWebRequest.Create(new Uri(URI));
ftp.Credentials = new NetworkCredential(ftp_username, ftp_password);
ftp.KeepAlive = false;
//指定执行命令
ftp.Method = WebRequestMethods.Ftp.UploadFile;
//指定数据传输类型
ftp.UseBinary = true;
//15秒超时
ftp.Timeout = 15000;
using (Stream ftp_stream = ftp.GetRequestStream())
{
//锁
lock (data_monitor)
{
//指向内存流头
data_stream.Position = 0;
data_stream.CopyTo(ftp_stream);
data_writer.Close();
data_stream.Close();
data_stream = new MemoryStream();
data_writer = new StreamWriter(data_stream);
}
ftp_stream.Close();
}