简体   繁体   中英

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)

My problem was solved by setting ServicePointManager.DefaultConnectionLimit

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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