2009-09-01 44 views
43

Tôi đang thử nghiệm ứng dụng web và đã thiết lập chương trình kiểm tra cửa sổ xoay một số chuỗi và gửi yêu cầu web trên mỗi chủ đề.Số lượng tối đa HttpWebRequests đồng thời

Vấn đề là tôi nhận được kết quả như sau:

01/09/09 11:34:04 Starting new HTTP request on 10 
01/09/09 11:34:04 Starting new HTTP request on 11 
01/09/09 11:34:04 Starting new HTTP request on 13 
01/09/09 11:34:05 Starting new HTTP request on 14 
01/09/09 11:34:05 Starting new HTTP request on 11 
01/09/09 11:34:05 11 has finished! 
01/09/09 11:34:05 Starting new HTTP request on 13 
01/09/09 11:34:05 13 has finished! 
01/09/09 11:34:05 Starting new HTTP request on 14 
01/09/09 11:34:05 14 has finished! 
01/09/09 11:34:05 Starting new HTTP request on 11 
01/09/09 11:34:05 11 has finished! 
01/09/09 11:34:05 Starting new HTTP request on 14 
01/09/09 11:34:05 14 has finished! 
01/09/09 11:34:05 Starting new HTTP request on 13 
01/09/09 11:34:05 13 has finished! 
01/09/09 11:34:05 Starting new HTTP request on 15 
01/09/09 11:34:06 Starting new HTTP request on 11 
01/09/09 11:34:06 11 has finished! 
01/09/09 11:34:06 Starting new HTTP request on 14 
01/09/09 11:34:06 14 has finished! 

mà loại trông giống như có một tối đa là 5 chủ đề, ngay cả khi tôi tạo ra 100 như vậy:

int numberOfThreads = Convert.ToInt32(txtConcurrentThreads.Text); 

    List<BackgroundWorker> workers = new List<BackgroundWorker>(); 

    for (int N = 0; N < numberOfThreads; N++) 
    { 

     BackgroundWorker worker = new BackgroundWorker(); 
     worker.DoWork += new DoWorkEventHandler(worker_DoWork); 
     worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted); 
     workers.Add(worker); 
    } 


    foreach(BackgroundWorker worker in workers) 
    { 
     worker.RunWorkerAsync(); 
    } 

bất cứ ai có thể soi sáng cho tôi như những gì đang xảy ra?

Cảm ơn

EDIT: Nếu như đề nghị tôi ngủ trong vòng 5 giây, thay vì HttpWebRequest, sau đó tôi nhận được thêm bài bắn nhưng không nhiều như tôi lại có thể ngờ:

01/09/09 11:56:14 Starting new HTTP request on 7 
01/09/09 11:56:14 Starting new HTTP request on 11 
01/09/09 11:56:15 Starting new HTTP request on 12 
01/09/09 11:56:15 Starting new HTTP request on 13 
01/09/09 11:56:16 Starting new HTTP request on 14 
01/09/09 11:56:16 Starting new HTTP request on 15 
01/09/09 11:56:17 Starting new HTTP request on 16 
01/09/09 11:56:17 Starting new HTTP request on 17 
01/09/09 11:56:18 Starting new HTTP request on 18 
01/09/09 11:56:19 Starting new HTTP request on 7 
01/09/09 11:56:19 7 has finished! 
01/09/09 11:56:19 Starting new HTTP request on 11 
01/09/09 11:56:19 11 has finished! 
01/09/09 11:56:19 Starting new HTTP request on 19 
01/09/09 11:56:20 Starting new HTTP request on 20 
01/09/09 11:56:20 Starting new HTTP request on 12 
01/09/09 11:56:20 12 has finished! 

Nó vẫn có vẻ như tôi chỉ nhận được 2 chủ đề bắt đầu mỗi giây, điều đó có vẻ mạnh mẽ với tôi. Tôi cho rằng Console.WriteLine có thể là một vấn đề?

EDIT: Tôi thiết

ThreadPool.SetMinThreads(100, 4); 

System.Net.ServicePointManager.DefaultConnectionLimit = 100; 

và nhận được kết quả như sau:

01/09/09 14:00:07 Starting new HTTP request on 11 
01/09/09 14:00:07 Starting new HTTP request on 81 
01/09/09 14:00:07 Starting new HTTP request on 82 
01/09/09 14:00:07 Starting new HTTP request on 79 
01/09/09 14:00:07 Starting new HTTP request on 83 
01/09/09 14:00:07 Starting new HTTP request on 84 
01/09/09 14:00:07 Starting new HTTP request on 85 
01/09/09 14:00:07 Starting new HTTP request on 87 
01/09/09 14:00:07 Starting new HTTP request on 88 
... 
01/09/09 14:00:07 84 has finished! Took 323.0323 milliseconds 
01/09/09 14:00:08 88 has finished! Took 808.0808 milliseconds 
01/09/09 14:00:08 96 has finished! Took 806.0806 milliseconds 
01/09/09 14:00:08 94 has finished! Took 806.0806 milliseconds 
01/09/09 14:00:08 98 has finished! Took 801.0801 milliseconds 
01/09/09 14:00:08 80 has finished! Took 799.0799 milliseconds 
01/09/09 14:00:08 86 has finished! Took 799.0799 milliseconds 
01/09/09 14:00:08 92 has finished! Took 799.0799 milliseconds 
01/09/09 14:00:08 100 has finished! Took 812.0812 milliseconds 
01/09/09 14:00:08 82 has finished! Took 1010.101 milliseconds 

nên đã có thể đẩy ra rất nhiều toàn bộ các yêu cầu web đồng thời. Mà dường như xếp hàng (gọi ra một máy chủ STA COM +) vì vậy đó là những gì tôi mong đợi.

Cảm ơn sự giúp đỡ của bạn

+1

Tôi có một câu hỏi cho bạn giải pháp ở đây. theo msdn (https://msdn.microsoft.com/en-us/library/system.net.servicepointmanager.defaultconnectionlimit(v=vs.110).aspx), giá trị mặc định là int32 tối đa, đó là cách lớn hơn hơn 100 bạn đặt ở đây. Làm thế nào để nó tạo sự khác biệt ngay cả khi bạn không đặt nó thành 100? Tôi có nghĩa là, tôi loại nghi ngờ nếu bạn giải quyết nó bằng cách thiết lập giới hạn kết nối mặc định của ServicePointManager hoặc thay vì bằng cách thiết lập phần tử connectionManagement trong câu trả lời đầu tiên. – foxwendy

+1

@foxwendy Yeah, MSDN nói là vậy. int.MaxValue, khi tôi đã thử nó trong .NET 4.5 nó chỉ ** 2 ** theo mặc định. – xmedeko

Trả lời

56

Có phải tất cả (hoặc hầu hết) yêu cầu của bạn có cùng một máy chủ không? Có giới hạn tích hợp trên cơ sở mỗi máy chủ. Bạn có thể thay đổi điều này trong app.config trong phần tử system.Net connectionManagement.

Điều khác là hồ bơi luồng chỉ tăng dần số chủ đề của nó dần dần - nó bắt đầu một chuỗi mới sau mỗi nửa giây, IIRC. Có thể đó là những gì bạn đang nhìn thấy? Hãy thử loại bỏ HttpWebRequest khỏi phương trình - chỉ cần ngủ vài giây thay vì ...

Tôi nghi ngờ vấn đề thứ hai là vấn đề thứ nhất bạn đang gặp phải, nhưng vấn đề đầu tiên sẽ khiến bạn gặp vấn đề tốt.

+0

Có, tất cả họ đều sẽ đến localhost. – Duncan

+0

Tôi không biết liệu giới hạn đó có áp dụng cho localhost hay không ... nhưng đó chắc chắn là điều cần lưu ý. Xem chỉnh sửa của tôi cho một liên kết đến appropraite app.config element. –

+0

Cảm ơn, sẽ làm. – Duncan

48

Có giới hạn về số lượng kết nối HTTP gửi đi đồng thời. Tôi nghĩ bạn có thể kiểm soát điều này bằng cách sử dụng thuộc tính tĩnh System.Net.ServicePointManager.DefaultConnectionLimit trước khi tạo đối tượng HttpWebRequest.

+0

Trong trường hợp bất kỳ ai tò mò, giá trị mặc định của cài đặt này là 2 –

1

Nếu tôi viết thẻ bên dưới trong cấu hình cửa sổ thì nó sẽ được thực hiện mỗi khi mã bên dưới được thực thi. Vì vậy, mỗi lần bên dưới mã được thực hiện tôi sẽ được phép có tối đa 1000000 không yêu cầu/đáp ứng song song.

HttpWebRequest POSTRequest = (HttpWebRequest)WebRequest.Create("http://yahoo.com"); 

Tag

<connectionManagement> 
<clear/> 
<add address="*" maxconnection="1000000" /> 
</connectionManagement> 
3

Tôi chưa từng nghe nhiều về việc này cho NET Core.ServicePointManager đã không được đưa vào NET Core 1, nhưng dường như là trở lại trong phiên bản 2. Tuy nhiên, cho HttpClient, bạn cũng có thể thiết lập số lượng tối đa các kết nối như thế này:

new HttpClient(new HttpClientHandler 
       { 
        MaxConnectionsPerServer = 100 
       }) 
Các vấn đề liên quan