【发布时间】:2014-09-26 13:01:08
【问题描述】:
我想做多线程异步下载管理器。但是我在多线程方面遇到了问题。 一个线程可以正常工作,但是当我创建第二个线程时 - 什么也没有。 我认为 webrequest 的同步存在问题。我读了这个答案Multithreading a large number of web requests in c#,但我并不完全理解。现在的问题:如何修改代码以使用多线程(线程,线程池)。
班级DownloadableContent:
{
private string url { get; set; }
private string path { get; set; }
private Stream streamResponse { get; set; }
private Stream streamLocal { get; set; }
private HttpWebRequest webRequest { get; set; }
private HttpWebResponse webResponse { get; set; }
public DownloadableContent(string url, string path)
{
this.url = url;
this.path = path;
}
public void Download()
{
using (WebClient wcDownload = new WebClient())
{
try
{
webRequest = (HttpWebRequest)WebRequest.Create(url);
webRequest.Credentials = CredentialCache.DefaultCredentials;
webResponse = (HttpWebResponse)webRequest.GetResponse();
Int64 fileSize = webResponse.ContentLength;
streamResponse = wcDownload.OpenRead(url);
streamLocal = new FileStream(path, FileMode.Create, FileAccess.Write, FileShare.None);
byte[] downBuffer = new byte[2048];
int bytesSize = 0;
while ((bytesSize = streamResponse.Read(downBuffer, 0, downBuffer.Length)) > 0)
{
streamLocal.Write(downBuffer, 0, bytesSize);
}
}
finally
{
streamResponse.Close();
streamLocal.Close();
}
}
}
}
还有班级main:
DownloadableContent file = new DownloadableContent("url", @"path");
Thread thread = new Thread(file.Download);
thread.Start();
【问题讨论】:
-
您的代码非常混乱。您正在使用
WebClient和HttpWebRequest。因此,您为每个 URL 发出两个请求。您应该删除webRequest和webResponse,而只使用WebClient。 -
您遇到问题的原因很可能是您没有处理您正在创建的
webRequest和webResponse对象。我从经验中知道,这通常会在几个请求后导致事情停止工作。由于您没有使用它们,只需将它们从您的代码中删除即可。 -
我只留下了一个代码
Webclient,现在效果很好
标签: c# multithreading webrequest