2010-08-30 34 views
5

Tại một thời điểm trong mã của tôi, tôi đăng ký vào the following event: -Làm cách nào để kiểm tra xem một sự kiện đã được đăng ký, trong .NET?

UploadFolderMessageQueue.ReceiveCompleted += UploadMSMQReceiveCompleted; 

hoạt động tuyệt vời và khi Queue của tin nhắn Nhận được Completed cháy sự kiện, đại biểu của tôi xử lý nó.

Bây giờ, tôi muốn KIỂM TRA xem sự kiện đã được đăng ký chưa, trước khi tôi đăng ký nó. Tôi nhận được một lỗi thời gian biên dịch khi tôi làm: -

// Compile Time Errors... 
if (UploadFolderMessageQueue.ReceiveCompleted == null) 
    { 
     UploadFolderMessageQueue.ReceiveCompleted += UploadMSMQReceiveCompleted; 
     UploadFolderMessageQueue.Formatter = 
      new XmlMessageFormatter(new[] {typeof (string)}); 
    } 

Sự kiện 'System.Messaging.MessageQueue.ReceiveCompleted' chỉ có thể xuất hiện ở phía bên tay trái của + = hoặc - =

tôi biết điều này là xấu hổ đơn giản .. nhưng tôi bối rối :(Bất kỳ lời đề nghị?

+0

Bạn nên cố gắng thiết kế mã của mình để bạn đăng ký và hủy đăng ký theo cách có thể dự đoán được. –

Trả lời

13

bạn không thể làm điều này từ thuê bao đến sự kiện này. Chỉ có nhà xuất bản có thể kiểm tra nếu có bất kỳ thuê bao. Yo u sẽ cần phải theo dõi các thuê bao sử dụng một số cơ chế khác trong lớp học của bạn như:

UploadFolderMessageQueue.ReceiveCompleted += UploadMSMQReceiveCompleted; 
bool handlerAttached=true; 

sau đó bạn có thể sử dụng này:

if(handlerAttached) 
{ 
    //DO YOUR STUFF 
} 
0

Các thử nghiệm rỗng chỉ có thể được thực hiện trong lớp đó tuyên bố sự kiện (tức là Loại UploadFolderMessageQueue.)

1) Nếu bạn có quyền truy cập vào nguồn của lớp này, bạn có thể thêm phương thức hoặc thuộc tính thực hiện phép thử và trả về kết quả boolean mà bạn có thể kiểm tra trước khi đăng ký.

2) Nếu bạn không thể sửa đổi lớp khai báo và bạn chỉ kiểm tra đăng ký lại từ mã của riêng mình, bạn có thể ghi riêng đăng ký trong biến boolean, sau đó kiểm tra biến đó trước khi cố gắng (lại) đăng ký.

3) Nếu bạn không thể thay đổi lớp khai báo và bạn đang kiểm tra đăng ký từ mã khác với mã của riêng bạn, có vẻ như không phải là giải pháp.

14

Nếu bạn cần phải chắc chắn rằng chỉ có một thuê bao có thể sử dụng đoạn mã sau:

UploadFolderMessageQueue.ReceiveCompleted -= UploadMSMQReceiveCompleted; 
UploadFolderMessageQueue.ReceiveCompleted += UploadMSMQReceiveCompleted; 

Nếu UploadFolderMessageQueue.ReceiveCompletednull sau đó dòng đầu tiên sẽ không làm gì cả, trong trường hợp khác xử lý sự kiện sẽ đã xóa. Điều đó có nghĩa là UploadFolderMessageQueue.ReceiveCompleted sẽ luôn chỉ có một người đăng ký (tất nhiên nếu UploadMSMQReceiveCompleted là trình xử lý sự kiện duy nhất cho sự kiện đó).

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