最大线程数

时间:2012-06-30 19:47:05

标签: c# .net multithreading thread-safety threadpool

我有用户控件,其方法为

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

        downloadThread.Start();
    }

在表单中,我有4个用户控件。但是当我在每个控件的用户控件DownloadFileAsync()中调用时,只有两个控件开始下载。完成其中一个后,下一个开始下载。

问题是什么以及如何每次下载simultanesly?

感谢您的关注。

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

1 个答案:

答案 0 :(得分:11)

HTTP在很长一段时间内每Web Origin次限制为2个连接,因此人们不会同时启动过多的下载。这个限制已被取消,但许多实现,包括HttpWebRequest仍然实现它。

来自draft-ietf-httpbis-p1-messaging

  

客户端(包括代理)应该限制同时发生的数量    他们维护到给定服务器(包括代理)的连接。

     

以前的HTTP修订版提供了特定数量的连接    天花板,但这被发现对许多应用来说是不切实际的。    因此,本规范并未强制要求特定的最大值    连接数量,但鼓励客户    打开多个连接时保守。

您可以通过设置ConnectionLimit Property来更改连接限制,如下所示:

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

请勿将限制设置得太高,因此不要使服务器过载。

此外,您应该考虑使用WebClient Class及其提供的异步方法(例如DownloadDataAsync Method),而不是使用线程。有关如何更改连接限制的信息,请参阅How can I programmatically remove the 2 connection limit in WebClient