Я хочу создать многопотоковый асинхронный менеджер загрузок. Но у меня проблемы с многопотоком. Один поток правильно работает, но когда я создаю вторую нить - ничего не работает. Я предполагаю, что проблема с синхронизацией webrequest. Я прочитал этот ответ Multithreading a large number of web requests in c#, но я не понял полностью. Теперь вопрос: как я могу изменить код для использования многопоточности (Thread, Threadpool).многопоточная программа с 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'. В результате вы делаете два запроса для каждого URL-адреса. Вы должны удалить 'webRequest' и' webResponse' и просто использовать 'WebClient'. –
Скорее всего, причина, по которой вы столкнулись с проблемой, заключается в том, что вы не используете объекты 'webRequest' и' webResponse', которые вы создаете. По опыту я знаю, что это часто заставляет вещи перестать работать после нескольких запросов. Поскольку вы не используете их, просто удалите их из своего кода. –
Я оставил в коде только «Webclient», и теперь он работает хорошо –