我想制作多线程异步下载管理器。但是我有多线程问题。 一个线程正常工作,但是当我创建第二个线程时 - 什么都不工作。 我认为webrequest的同步问题。我读了这个回答Multithreading a large number of web requests in c#,但我完全不明白。现在问题:我如何修改代码以使用多线程(线程,线程池)。webrequests 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'。因此,您正在为每个网址提出两个请求。您应该删除'webRequest'和'webResponse',并使用'WebClient'。 – 2014-09-26 16:23:28
很可能你遇到问题的原因是你没有处理你正在创建的'webRequest'和'webResponse'对象。我从经验中知道,这往往会导致事情在几个请求后停止工作。由于您没有使用它们,只需将它们从代码中移除即可。 – 2014-09-26 16:25:09
我只在代码中留下了'Webclient',现在效果很好 – 2014-09-27 15:37:28