2010-03-31 32 views
12

Chúng tôi có một tình huống mà chúng tôi muốn giới hạn số lượng yêu cầu paralell mà ứng dụng của chúng tôi có thể thực hiện cho máy chủ ứng dụng của nó. Chúng ta có khả năng chạy 100 thread nền mà sẽ muốn tại một số điểm thực hiện cuộc gọi đến máy chủ ứng dụng nhưng chỉ muốn 5 luồng để có thể gọi SendMessage() (hoặc bất kỳ phương thức nào sẽ) tại bất kỳ thời điểm nào. Cách tốt nhất để đạt được điều này là gì?Giới hạn số lượng chủ đề thực hiện một phương thức tại một thời điểm

Tôi đã xem xét sử dụng một số loại đối tượng gatekeeper để chặn các chuỗi đi vào phương thức cho đến khi số lượng chuỗi thực hiện trong đó đã giảm xuống dưới ngưỡng. Đây có phải là một giải pháp hợp lý hay tôi nhìn ra thực tế rằng điều này có thể là bẩn/nguy hiểm?

Chúng tôi đang phát triển trong C# .NET 3.5.

Cảm ơn,

Steve

Trả lời

1

Lớp Semaphore được thiết kế cho đúng kịch bản này.

10

Bạn muốn có một semaphore ... System.Threading.Semaphore

public static class MyClass 
{ 
    private static Semaphore sem = new Semaphore(5, 5); 

    public static void SendMessage() 
    { 
     sem.WaitOne(); 

     try 
     { 
     } 
     finally 
     { 
      sem.Release(1); 
     } 
    } 
} 

Ngoài ra, nếu bạn chỉ muốn có một chủ đề duy nhất để có thể gọi một phương thức tại một thời điểm nhất định, NET cũng cho thấy một khái niệm tương đương với thuộc tính được đồng bộ hóa của java:

[System.Runtime.CompilerServices.MethodImpl(MethodImpl.Synchronized)] 
+1

bạn có thể muốn phát hành semaphore ngay cả khi ngoại lệ * không được * ném. Đặt nó trong khối cuối cùng –

+0

oops, xấu của tôi, nhờ – LorenVS

+3

Thuộc tính đồng bộ hóa phương pháp cấp là xấu. Nó khóa trên "điều này" cho các thành viên ví dụ và thậm chí tệ hơn, loại cho các thành viên tĩnh. Nó không bao giờ nên được sử dụng. – Josh

1

Cách tiếp cận mẫu thiết kế: - Sử dụng mẫu lệnh với năm Chuỗi công việc và bọc yêu cầu của bạn trong lớp Lệnh.

Các vấn đề liên quan