2011-01-19 60 views
7

Tôi muốn đưa ra một loạt các sự kiện từ lớp thư viện của mình, nhưng tôi lo lắng rằng một số người đăng ký sự kiện sẽ thô lỗ và mất nhiều thời gian để xử lý một số sự kiện. Tôi nghĩ tôi có thể bảo vệ các chủ đề nâng cao bằng cách sử dụng một thread hồ bơi để tăng mỗi sự kiện:Tôi có thể sử dụng BeginInvoke với MulticastDelegate không?

if (packet != null && DataPacketReceived != null) 
{ 
    var args = new DataPacketEventArgs(packet); 
    DataPacketReceived.BeginInvoke(this, args, null, null); 
} 

Đó hoạt động tốt khi chỉ có một thuê bao đến sự kiện này, nhưng ngay sau khi một thuê bao thứ hai đến, DataPacketReceived trở thành một đại biểu multicast, và tôi nhận được một ngoại lệ đối số với thông báo lỗi, "Người đại diện phải có chỉ một mục tiêu." Có một cách dễ dàng để nâng cao sự kiện trên một chủ đề riêng biệt, hoặc tôi phải bắt đầu một chủ đề và sau đó nâng cao sự kiện từ đó?

Trả lời

11

Tôi đã tìm thấy câu hỏi tương tự trên another site và dĩ nhiên Jon Skeet đã trả lời câu hỏi đó. Đối với kịch bản của tôi, tôi đã chọn để nâng cao sự kiện cho từng người đăng ký theo một chủ đề riêng biệt:

if (packet != null && DataPacketReceived != null) 
{ 
    var args = new DataPacketEventArgs(packet); 
    var receivers = DataPacketReceived.GetInvocationList(); 
    foreach (EventHandler<DataPacketEventArgs> receiver in receivers) 
    { 
     receiver.BeginInvoke(this, args, null, null); 
    } 
} 
+2

Đúng, nhưng lưu ý rằng gọi là 'BeginInvoke' trên từng người đăng ký riêng lẻ không nhất thiết phải chạy trên một chủ đề riêng biệt. Đó là kinh doanh của nhóm chủ đề. – Ani

+1

Tôi đã xem xét vấn đề này một vài lần trong vài ngày qua, Điều quan trọng cần lưu ý là các đối tượng trong 'receivers' không thực sự thuộc kiểu' EventHandler ', đó là một diễn viên rõ ràng. –

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