簡體   English   中英

WebClient的多個任務超時

[英]Multiple Tasks timeout with WebClient

我使用此代碼下載文件:

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);
    }
}

當我將其作為單個任務啟動時,它可以完美地工作。

        TestFileDownloader _fd1 = new TestFileDownloader();
        _fd1.ReportProgerss = reportProgress;

        Task _task = new Task(
          () => _fd1.startHTTPDownload("http://", 
                                      @"d:\..."));
        _task.Start();

當我嘗試像這樣使用它時:

            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();

我超時了。

怎么了?

這篇文章對我有幫助:

嘗試並行運行多個HTTP請求,但受到Windows(注冊表)的限制

通過設置ServicePointManager.DefaultConnectionLimit解決了我的問題

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM