2012-12-26 47 views
5

giả sử tôi có:sự kiện và luồng

ethernet_adapter.PacketArrived += (s, e) => 
{ 
    //long processing... 
}; 

xử lý có thể mất một thời gian dài và trong khi nó nằm ở giữa gói khác đã đến. Điều gì sẽ xảy ra tiếp theo: xử lý được thực hiện và sau đó một sự kiện khác được kích hoạt hoặc có lẽ sự kiện mới sẽ được kích hoạt ngay lập tức nhưng trên một chuỗi mới?

+0

Loại đối tượng nào là 'ethernet_adapter'? –

+0

@JimMischel là một loại thư viện của bên thứ ba 'ICaptureDevice'. Tôi nghĩ tôi có câu trả lời. – ren

Trả lời

2

Bạn không nên giả định. Nó có thể là bất cứ điều gì tùy thuộc vào cách thức sự kiện được nâng lên theo loại (của đối tượng ethernet_adapter).

Nếu hoạt động đồng bộ, sự kiện mới sẽ không được nâng lên cho đến khi hoạt động hiện tại đang được tiến hành.

Nếu hoạt động không đồng bộ, sự kiện mới sẽ được nâng lên ngay lập tức.

2

Rất có thể đây là thao tác đồng bộ. Cách duy nhất nó sẽ xảy ra trên một chủ đề khác là nếu đối tượng làm tăng sự kiện làm như vậy trên một chủ đề khác, hoặc nếu bạn làm trong trình xử lý. Có nhiều cách để thực hiện việc này, nhưng sử dụng System.Threading.Tasks.Task thường được ưu tiên nếu sử dụng .NET 4.

Cân nhắc kỹ cách bạn muốn ứng dụng của mình hoạt động. Chỉ cần xử lý từng gói trên một luồng mới có thể khiến các gói tin được xử lý không đúng thứ tự. Bạn có thể muốn xếp hàng chúng lên và có một chuỗi nền xử lý chúng tại thời điểm đó. Hoặc bạn có thể không cần phải làm gì cả.

0

bạn có thể xếp hàng toàn bộ tác vụ trong ThreadPool như sau.

ethernet_adapter.PacketArrived += (s, e) => 
{ 
ThreadPool.QueueUserWorkItem("long processing item"); 
}; 

hoặc bạn có thể tạo nhiệm vụ (.net 4.0) cho mỗi chuỗi.

+0

Điều này liên quan đến câu hỏi OP như thế nào? – Tilak

+0

mỗi mục xử lý dài có thể được xếp hàng trong threadpool và sẽ được phục vụ phù hợp. Tôi hy vọng tôi đã hiểu được vấn đề. – paritosh

+0

Tôi nghĩ, câu hỏi là, "hành vi" là gì và không "cách xử lý async" – Tilak

0

Giả sử có một phương thức trong lớp ethernet_adapter của bạn:

protected virtual void OnPacketArrived(PacketArrivedEventArgs e) 
{ 
    EventHandler<PacketArrivedEventArgs> handler = this.PacketArrived; 

    if (handler != null) 
    { 
     handler(this, e); 
    } 
} 

chế biến Chừng nào thuê bao đồng bộ (như trong ví dụ của bạn) sẽ chặn liệt kê nội bộ trên tất cả các thuê bao. NHƯNG! Nó có thể không chặn các cuộc gọi tiếp theo tới số OnPacketArrived nếu số ethernet_adapter gọi nó theo một chủ đề khác nhau mỗi lần - vì vậy bạn sẽ nhận được hai xử lý dài đồng thời, v.v.

Ví dụ, có một cái nhìn tại thực hiện Socket: đó là phương pháp async gây callbacks hoàn thành được gọi trên chủ đề IOCP - khác nhau mỗi lần trong khi có bất kỳ trong IO ThreadPool.

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