2012-01-03 35 views
5

Tôi muốn thực hiện thuật toán ga tốt bằng .net (C# hoặc VB) nhưng tôi không thể tìm ra cách tôi có thể làm điều đó.Thuật toán điều khiển .NET

Trường hợp trang web asp.net của tôi sẽ đăng các yêu cầu đến một trang web khác để tìm nạp kết quả. Tối đa 300 yêu cầu mỗi phút phải được gửi.

Nếu yêu cầu vượt quá giới hạn 300, bên kia Api sẽ không trả lại gì (Đó là điều tôi không muốn sử dụng làm séc trong mã của tôi).

P.S. Tôi đã thấy giải pháp trong ngôn ngữ khác ngoài .net nhưng tôi là một newbie và hãy tử tế và giữ câu trả lời của bạn đơn giản như 123.

Cảm ơn bạn

+1

Bản sao có thể có của [Tác vụ điều chỉnh không đồng bộ] (http://stackoverflow.com/questions/22492383/throttling-asynchronous-tasks) –

Trả lời

5

Bạn có thể có một ứng dụng đơn giản (hoặc phiên) lớp và kiểm tra để biết số lần truy cập. Đây là điều cực kỳ khó khăn chỉ để cho bạn ý tưởng:

public class APIHits { 
    public int hits { get; private set; } 
    private DateTime minute = DateTime.Now(); 

    public bool AddHit() 
    { 
     if (hits < 300) { 
      hits++; 
      return true; 
     } 
     else 
     { 
      if (DateTime.Now() > minute.AddSeconds(60)) 
      { 
       //60 seconds later 
       minute = DateTime.Now(); 
       hits = 1; 
       return true; 
      } 
      else 
      { 
       return false; 
      } 
     } 
    } 
} 
2

Phương pháp đơn giản nhất là chỉ để thời gian bao lâu là giữa các gói tin và không cho phép họ được gửi với tốc độ hơn một mỗi 0,2 giây. Tức là, ghi lại thời gian bạn được gọi và khi bạn được gọi tiếp theo, hãy kiểm tra xem có ít nhất 200ms đã nắm bắt hoặc không trả lại gì. Phương pháp này sẽ hoạt động, nhưng nó sẽ chỉ hoạt động cho các luồng gói trơn tru - nếu bạn mong đợi các hoạt động sau đó bạn có thể muốn cho phép 5 tin nhắn trong bất kỳ khoảng thời gian 200ms nào miễn là trung bình trên 1 phút không quá 300 cuộc gọi. Trong trường hợp này, bạn có thể sử dụng một mảng giá trị để lưu trữ "dấu thời gian" của 300 gói cuối cùng và sau đó mỗi lần yoiu nhận được cuộc gọi, bạn có thể xem lại "300 cuộc gọi trước" để kiểm tra xem ít nhất 1 phút đã trôi qua .

Đối với cả hai đề án này, giá trị thời gian trả về Environment.TickCount sẽ phù hợp với nhu cầu của bạn (kéo dài không dưới 200 mili giây), vì nó chính xác khoảng 15 ms.

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