简体   繁体   English

WebClient的多个任务超时

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM