[英]Multiple Tasks timeout with WebClient
I use thise code for download file: 我使用此代码下载文件:
public delegate void ReportProgerssDelegate(int progerss);
public class TestFileDownloader
{
public ReportProgerssDelegate ReportProgerss;
public void startHTTPDownload(string urlToReadFileFrom, string filePathToWriteFileTo)
{
Uri _url = new Uri(urlToReadFileFrom);
System.Net.HttpWebRequest _request = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(_url);
System.Net.HttpWebResponse _response = (System.Net.HttpWebResponse)_request.GetResponse();
Int64 _downloadedFileSize = _response.ContentLength;
Int64 _totalNumberOfReadedBytes = 0;
using (System.Net.WebClient _webClient = new System.Net.WebClient())
{
using (System.IO.Stream _streamRemote = _webClient.OpenRead(new Uri(urlToReadFileFrom)))
{
using (Stream _streamLocal = new FileStream(filePathToWriteFileTo, FileMode.Create, FileAccess.Write, FileShare.None))
{
int _numberOfReadedBytes = 0;
byte[] _byteBuffer = new byte[1024];
while ((_numberOfReadedBytes = _streamRemote.Read(_byteBuffer, 0, _byteBuffer.Length)) > 0)
{
_streamLocal.Write(_byteBuffer, 0, _numberOfReadedBytes);
_totalNumberOfReadedBytes += _numberOfReadedBytes;
reportProgress(_totalNumberOfReadedBytes, _downloadedFileSize);
}
_streamLocal.Close();
}
_streamRemote.Close();
}
}
reportProgress(100, 100);
}
private void reportProgress(long totalNumberOfReadedBytes, long downloadedFileSize)
{
double _index = (double)(totalNumberOfReadedBytes);
double _total = (double)downloadedFileSize;
double _progress = (_index / _total);
int _progressPercentage = (int)(_progress * 100);
if (ReportProgerss != null)
ReportProgerss(_progressPercentage);
}
}
When I start it as a single task, it works perfect. 当我将其作为单个任务启动时,它可以完美地工作。
TestFileDownloader _fd1 = new TestFileDownloader();
_fd1.ReportProgerss = reportProgress;
Task _task = new Task(
() => _fd1.startHTTPDownload("http://",
@"d:\..."));
_task.Start();
when I try to use it like this: 当我尝试像这样使用它时:
TestFileDownloader _fd1 = new TestFileDownloader();
_fd1.ReportProgerss = reportProgress;
TestFileDownloader _fd2 = new TestFileDownloader();
_fd2.ReportProgerss = reportProgress;
TestFileDownloader _fd3 = new TestFileDownloader();
_fd3.ReportProgerss = reportProgress;
Task _task = new Task(
() => _fd1.startHTTPDownload("http://",
@"d:\..."));
_task.Start();
Task _task2 = new Task(
() => _fd2.startHTTPDownload("http://",
@"d:\..."));
_task2.Start();
Task _task3 = new Task(
() => _fd3.startHTTPDownload("http://",
@"d:\..."));
_task3.Start();
I got timeout. 我超时了。
What is wrong? 怎么了?
This post helped me: 这篇文章对我有帮助:
Trying to run multiple HTTP requests in parallel, but being limited by Windows (registry) 尝试并行运行多个HTTP请求,但受到Windows(注册表)的限制
My problem was solved by setting ServicePointManager.DefaultConnectionLimit 通过设置ServicePointManager.DefaultConnectionLimit解决了我的问题
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.