2013-01-23 27 views
6

trạng ban đầuC# throttling Đối với loop

Tôi đang phát triển một .NET Framework 4.0, C#, Winform Application. Ứng dụng sẽ liệt kê (và kiểm tra) các WebServiceOperations trong một GridView (với hiện tại là 60 DataRows => WebServiceOperations).

Mục tiêu

tôi phải kiểm tra/gọi tất cả các hoạt động này với một cú nhấp chuột vào một nút. Mỗi thao tác tạo một thể hiện mới của một lớp. Trong lớp này, tôi gọi WebServiceOperation là không đồng bộ và đợi kết quả. Kết quả là sau đó beeing xác nhận. Toàn bộ mã hoạt động trơn tru bằng cách sử dụng các đại biểu và sự kiện.

Bây giờ nói đến các thách thức/câu hỏi: Khi nhấp vào nút đó, tôi sử dụng một vòng lặp for (int i = 0; i < gridViewWsOperations.RowCount; i ++) => với Nói cách khác, hiện tôi bắn 60 hoạt động tại cùng một thời điểm '=> Máy chủ bị xử lý quá tải 60 yêu cầu cùng một lúc và tôi bị hết thời gian chờ. Vì vậy, tôi cần phải bằng cách nào đó điều tiết số lượng yêu cầu concurrend để chúng ta hãy nói 10 cùng một lúc. Hãy xem xét, vòng lặp for (nơi tôi phải enqueue các yêu cầu) không phải là trong cùng một chủ đề như các phương pháp (process_result sự kiện), nơi tôi dequeue các yêu cầu. Tôi đã thử nó bằng cách sử dụng ConcurrentQueue vì loại bộ sưu tập này có vẻ là an toàn chỉ.

Liên kết

ConcurrentQueue at MSDN

một mẫu mã sẽ thực sự giúp đỡ!

--- đây là mã giải pháp/mẫu của tôi ---

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Collections.Concurrent; 
using System.Threading; 

namespace ConcurrentQueueSample 
{ 
    class Program 
    { 
     static SemaphoreSlim semaphoreSlim = new SemaphoreSlim(3); 

     static void Main(string[] args) 
     { 
      System.Timers.Timer timer = new System.Timers.Timer(); 
      timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed); 
      timer.Interval = 1234; 
      timer.Enabled = true; 
      timer.Start(); 

      for (int i = 0; i < 10; i++) new Thread(go).Start(i); 
     } 

     static void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) 
     { 
      semaphoreSlim.Release(); 
     } 

     static void go(object i) 
     { 
      Console.WriteLine("id: {0}", i); 
      semaphoreSlim.Wait(); 
      Console.WriteLine("id: {0} is in", i); 
      Thread.Sleep(1250); 
      Console.WriteLine("id: {0} left!", i); 
     } 
    } 
} 
+3

Hãy thử sử dụng một semaphore http://msdn.microsoft.com/en-us/library/system.threading.semaphore.aspx – cadrell0

+1

'semaphoreSlim.Release()' không được trong bộ hẹn giờ, nó phải là điều cuối cùng được gọi là 'go'. Ngoài ra bạn có thể muốn sử dụng một [ThreadPool] (http://msdn.microsoft.com/en-us/library/system.threading.threadpool.aspx) chủ đề thay vì một Thread đầy đủ. –

+0

Bạn có thể sử dụng Semaphore trong lớp gọi dịch vụ web để giới hạn số lượng yêu cầu đồng thời. – Hylaean

Trả lời

5

Bạn có thể muốn xem xét việc sử dụng lớp SemaphoreSlim để tăng tốc các chủ đề có quyền truy cập vào hàng đợi của bạn.