Lưu ý: Tôi đã chỉnh sửa câu hỏi này để giúp những người khác có cùng sự cố nhận trợ giúp ở đây dễ dàng hơn. Để xem câu hỏi gốc phù hợp hơn với một số câu trả lời, hãy kiểm tra lịch sử chỉnh sửa.Sự cố với sự kiện "chuỗi"
Trong một dự án tôi có một lớp ExecutionManager có thể chứa nhiều trường hợp của ExecutionSlot. Lớp ExecutionSlot có một số trường sự kiện công khai như sau:
public event EventHandlers.ObjectEventHandler<IPlugin> ExecuteCompleted;
Đối với mỗi sự kiện này có sự kiện phù hợp trên ExecutionManager. Hành vi mong muốn là mỗi khi ExecutionSlot tăng một sự kiện, sự kiện phù hợp cũng được nâng lên trên ExecutionManager chứa.
Giải pháp implmented là bất cứ khi nào một ExecutionSlot đã được thêm vào một ExecutionManager các ExectionManager sẽ thêm các sự kiện riêng của mình để của ExecutionSlot như thế này:
executionSlot.ExecuteCompleted += ExecuteCompleted;
Không cần phải nêu ra để loại bỏ một ExecutionSlot, vì vậy các sự kiện không bao giờ bị xóa.
Sự cố là sự kiện trên ExecutionManager không được nâng lên. Sau khi xác nhận rằng một sự kiện đã được reaised bởi một ExecutionSlot tôi phát hiện ra rằng việc thay đổi dòng trên như sau cố định vấn đề:
executionSlot.ExecuteCompleted += (sender, eventArgs) => ExecuteCompleted(sender, eventArgs);
Và tôi không thể tìm ra lý do tại sao, vì vậy câu hỏi của tôi là, những gì khác biệt là .
Lý do cho sự khác biệt này là lần đầu tiên thêm người nghe hiện tại của sự kiện ExecutionManager vào sự kiện của ExecutionSlot. Vì vậy, bất kỳ người nghe nào được thêm vào sau sẽ không được gọi khi sự kiện được nâng lên. Ngược lại, giải pháp thứ hai sử dụng lambda để nâng cao sự kiện của ExecutionManager, điều đó có nghĩa là người nghe tại thời điểm sự kiện sẽ được gọi.
Lý do cơ bản cho giải pháp đầu tiên bị lỗi, là các đại biểu không thay đổi được. Vì vậy, khi bạn thêm một đại biểu mới vào và sự kiện, bạn đang thực sự tạo ra một đại biểu mới có chứa các đại biểu hiện có và bổ sung. Vì vậy, bất kỳ tham chiếu đến các đại biểu được thực hiện trước sẽ không chứa các đại biểu mới được bổ sung.
có thể hoàn nguyên các chỉnh sửa của bạn về câu hỏi ban đầu của bạn, sau đó đặt một câu hỏi khác và trả lời nó, với các tham chiếu qua lại? – JoelFan
Tôi thấy điểm giữ văn bản gốc vì đó là câu trả lời ở đây. Nhưng vì văn bản gốc không đủ rõ ràng, tôi cảm thấy rằng văn bản mới sẽ là trợ giúp tốt hơn cho người khác, so với hầu hết các câu hỏi trùng lặp. –