3

私はこのような方法を持つユーザーコントロールを持っています

    public void DownloadFileAsync()
    {
        ThreadStart thread = DownloadFile;
        Thread downloadThread = new Thread(thread);

        downloadThread.Start();
    }

フォームでは、このように4つのユーザーコントロールがあります。しかし、各コントロールのユーザーコントロールDownloadFileAsync()を呼び出すと、そのうちの2つだけがダウンロードを開始します。それらの1つを終了した後、次はダウンロードを開始します。

問題は何ですか?ダウンロードごとに同時にダウンロードするにはどうすればよいですか?

ご清聴ありがとうございました。

    public void DownloadFile()
    {
        int byteRecieved = 0;
        byte[] bytes = new byte[_bufferSize];

        try
        {
            _webRequestDownloadFile = (HttpWebRequest)WebRequest.Create(_file.AddressURL);
            _webRequestDownloadFile.AddRange((int)_totalRecievedBytes);
            _webResponseDownloadFile = (HttpWebResponse)_webRequestDownloadFile.GetResponse();
            _fileSize = _webResponseDownloadFile.ContentLength;
            _streamFile = _webResponseDownloadFile.GetResponseStream();

            _streamLocalFile = new FileStream(_file.LocalDirectory, _totalRecievedBytes > 0 ? FileMode.Append : FileMode.Create);

            MessageBox.Show("Salam");
            _status = DownloadStatus.Inprogress;
            while ((byteRecieved = _streamFile.Read(bytes, 0, _bufferSize)) > 0 && _status == DownloadStatus.Inprogress)
            {

                _streamLocalFile.Write(bytes, 0, byteRecieved);

                _totalRecievedBytes += byteRecieved;

                if (_totalRecievedBytes >= _fileSize)
                {
                    argsCompleted.Status = DownloadStatus.Completed;
                    if (_fileDownloadCompleted != null)
                        _fileDownloadCompleted(_file, argsCompleted);
                    break;
                }

                argsProgress.UpdateEventArgument(DownloadStatus.Inprogress, _totalRecievedBytes);

                if (_fileDownloadProgress != null)
                    _fileDownloadProgress(_file, argsProgress);



            }
        }
        catch (Exception ex)
        {
            LogOperations.Log(ex.Message);
        }
        finally
        {
            _streamFile.Close();
            _streamFile.Close();
            _streamLocalFile.Close();
            _webResponseDownloadFile.Close();
        }
    }
4

1 に答える 1

11

HTTPには、非常に長い間Web Originごとに2つの接続の制限があったため、人々が並行してあまり多くのダウンロードを開始することはありませんでした。この制限は解除されましたが、HttpWebRequestを含む多くの実装はまだそれを実装しています。

ドラフト-ietf-httpbis-p1-messagingから:

クライアント(プロキシを含む)は、特定のサーバー(プロキシを含む)に対して維持する同時接続の数を制限する必要があります(SHOULD)。

HTTPの以前のリビジョンでは、上限として特定の数の接続が提供されていましたが、これは多くのアプリケーションにとって実用的ではないことがわかりました。結果として、この仕様は特定の最大接続数を義務付けていませんが、代わりに、複数の接続を開くときにクライアントが保守的になることを推奨しています。

次のようにConnectionLimitプロパティを設定することにより、接続制限を変更できます。

HttpWebRequest httpWebRequest = (HttpWebRequest)webRequest;
httpWebRequest.ServicePoint.ConnectionLimit = 10;

制限を高く設定しすぎないでください。サーバーが過負荷になることはありません。

また、スレッドを使用する代わりに、WebClientクラスとそれが提供する非同期メソッド(DownloadDataAsyncメソッドなど)の使用を検討する必要があります。ここで接続制限を変更する方法については、WebClientで2つの接続制限をプログラムで削除する方法を参照してください。

于 2012-06-30T19:57:59.870 に答える