我一直在尝试制作一个程序,将一个带宽节流文件(在压缩后)传输到同一网络上的另一台计算机上。
我需要控制它的带宽以避免饱和(就像Robocopy那样)。
最近,我发现了ThrottledStream类,但它似乎不起作用,因为我可以发送一个限制为1字节节流的9MB,并且它仍然几乎立即到达,所以我需要知道类是否有错误应用。
下面是代码:
using (FileStream originStream = inFile.OpenRead())
using (MemoryStream compressedFile = new MemoryStream())
using (GZipStream zippingStream = new GZipStream(compressedFile, CompressionMode.Compress))
{
originStream.CopyTo(zippingStream);
using (FileStream finalDestination = File.Create(destination.FullName + "\\" + inFile.Name + ".gz"))
{
ThrottledStream destinationStream = new ThrottledStream(finalDestination, bpsLimit);
byte[] buffer = new byte[bufferSize];
int readCount = compressedFile.Read(buffer,0,bufferSize);
while(readCount > 0)
{
destinationStream.Write(buffer, 0, bufferSize);
readCount = compressedFile.Read(buffer, 0, bufferSize);
}
}
}任何帮助都将不胜感激。
发布于 2013-06-07 00:34:09
链接到的ThrottledStream类使用延迟计算来确定在执行当前写入之前等待多长时间。此延迟基于当前写入之前发送的数据量以及已经过去的时间。一旦延迟周期过了,它就会将整个缓冲区写在一个块中。
这方面的问题是,它没有对特定写操作中写入的缓冲区的大小进行任何检查。如果要求它将吞吐量限制为每秒1字节,然后使用20 to缓冲区调用Write方法,它将立即写入整个20 to。如果然后尝试编写另一个数据块,即2字节长,它将等待很长时间(20*2^20秒)才会写入这两个字节。
为了使ThrottledStream类更顺利地工作,您必须使用非常小的数据块调用Write。每个块仍然会被立即写入,但是写操作之间的延迟会更小,吞吐量也会更均匀。
在您的代码中,您使用一个名为bufferSize的变量来确定内部循环中每次读/写要处理的字节数。尝试将bufferSize设置为256,这将导致更多的读和写,但将给ThrottledStream一个实际引入一些延迟的机会。
如果将bufferSize设置为与bpsLimit相同,则应该每秒钟完成一次写入操作。设置的bufferSize越小,每秒得到的写操作就越多,带宽节流就越顺畅。
通常,我们喜欢在每个操作中处理尽可能多的缓冲区,以减少开销,但在本例中,您将显式地尝试添加间接费用以减慢速度:)
https://stackoverflow.com/questions/16972801
复制相似问题