我被困在一个地方。我正在从URL读取flv文件。我正在将其读取到Stream,然后将此Stream写入循环中的MemoryStream。当代码出现在循环中时,我将整个MemoryStream写入ByteArray,然后将此ByteArray写入硬盘上的本地文件。
由于此flv太大,因此在循环中处理需要花费大量时间。我正在考虑在多个线程中读取MemoryStream中的原始大流。这意味着将Stream分成10个部分,并将这些部分写入多个线程中的MemoryStream。我该怎么做?
我附上了我的一段代码。
//Get a data stream from the url
WebRequest req = WebRequest.Create(url);
WebResponse response = req.GetResponse();
using (Stream stream = response.GetResponseStream())
{
//Download in chuncks
byte[] buffer = new byte[1024];
//Get Total Size
int dataLength = (int)response.ContentLength;
//Download to memory
//Note: adjust the streams here to download directly to the hard drive
using (MemoryStream memStream = new MemoryStream())
{
while (true)
{
//Try to read the data
int bytesRead = stream.Read(buffer, 0, buffer.Length);
if (bytesRead == 0)
{
Application.DoEvents();
break;
}
else
{
//Write the downloaded data
memStream.Write(buffer, 0, bytesRead);
}
}
//Convert the downloaded stream to a byte array
byte[] downloadedData = memStream.ToArray();
}
}
感谢任何帮助 谢谢
答案 0 :(得分:2)
您将无法使用多个线程加快下载速度。这里的限制因素不是您的计算机处理数据的速度,而是数据来自服务器的速度。
我建议您创建一个WebClient而不是WebRequest
,而不是尝试使用多个线程加快速度。然后,您可以调用WebClient.DownloadDataAsync
将数据下载到内存中,或者调用WebClient.DownloadFileAsync
直接下载到文件中。
其中任何一个都不会使下载更快,但它们会阻止您的用户界面在下载过程中无响应。
答案 1 :(得分:1)
线程在这里不会帮助你;你将被阻止IO。而不是在IO上阻塞1个线程,您现在将在IO上阻止多个线程。事实上,在许多情况下,在多个线程上与相同的资源(或并行但相关的资源)进行通信将降低 IO吞吐量,加上线程开销。输了:输了。
此外 - 大多数流未设计用于线程化;你需要一些非常复杂的协调代码,以确保你按照正确的顺序重新组合流,不要搞乱内部状态;坦白说,这不值得。