2010-08-13 40 views
8

Điều gì sẽ xảy ra khi 10 chủ đề sẽ đăng ký vào cùng một sự kiện và sự kiện xảy ra? Chủ đề nào sẽ chọn nó?Nhiều Chủ đề đăng ký cùng một sự kiện

+1

Ý của bạn là gì? Cách chủ đề có thể đăng ký sự kiện? Tôi nghĩ rằng bạn có nghĩa là một cái gì đó khác nhau ... – Incognito

+0

10 Chủ đề thực hiện cùng một phương pháp mà đăng ký một sự kiện. – koumides

+0

Câu hỏi này hơi khó hiểu hoặc có thể không được hiểu đúng. Nếu sự kiện là sự kiện Windows (tức là, được tạo bởi CreateEvent) và nhiều luồng đang đợi nó được báo hiệu, thì câu trả lời của ScottTx có vẻ đúng. Nếu sự kiện là sự kiện của khung ứng dụng (tương tự như sự kiện Delphi hoặc C# OnClick của một nút) thì nhiều câu trả lời có thể đúng! (nhưng sau đó một lần nữa làm thế nào có thể nhiều chủ đề đăng ký một sự kiện ứng dụng? !!).Thông điệp này có nghĩa là để cung cấp cho độc giả một cái đầu lên, mặc dù đây là một câu hỏi cũ. – ssh

Trả lời

16

Chủ đề không đăng ký sự kiện, đối tượng. Khi một sự kiện kích hoạt, tất cả các trình xử lý đã đăng ký thực hiện trên cùng một luồng (một trình xử lý sự kiện). Không có thiết bị tích hợp sẵn cho các sự kiện để kích hoạt nhiều luồng.

Trình xử lý có thể chọn chuyển tiếp thông tin sự kiện tới một chuỗi riêng biệt, nếu muốn, nhưng đó không phải là một phần của cơ chế gửi sự kiện được tích hợp sẵn.

+0

Nếu bạn muốn xem nhiều sự kiện không đồng bộ hơn, bạn có thể xem [Rx] (http://msdn.microsoft.com/en-us/devlabs/ee794896.aspx). Sử dụng Rx, nó khá dễ dàng để sắp xếp các sự kiện vào một chủ đề cụ thể (giả sử nó có một 'SynchronizationContext' để sắp xếp, dĩ nhiên). –

+0

tôi nghĩ rằng các chủ đề cũng là đối tượng ... :) – ultrajohn

+0

@ultrajohn: booooo! :) –

1

Tôi nghĩ điều bạn muốn nói ở đây là nhiều đối tượng trên các chuỗi riêng biệt đăng ký một sự kiện.

Tất cả trình xử lý sẽ được gọi nhưng trên cùng một chuỗi đã gọi sự kiện.

0

Câu trả lời cho câu hỏi của bạn tôi đoán là phụ thuộc vào việc triển khai trình điều phối sự kiện ... Thông thường bạn sử dụng danh sách để theo dõi tất cả các trình xử lý sự kiện đã đăng ký một sự kiện cụ thể, loại triển khai này, trình xử lý đầu tiên được kích hoạt là trình xử lý sự kiện đầu tiên đã đăng ký nếu bạn tất nhiên gọi tất cả các quy trình có liên quan một cách đồng bộ, nếu không, thì nó phụ thuộc ... chỉ cần một ý tưởng.

0

Nếu bạn muốn biết đối tượng nào sẽ nhận sự kiện, mọi đối tượng đăng ký một sự kiện sẽ nhận sự kiện đó, nhưng mỗi đối tượng sẽ chạy trên luồng mà sự kiện xảy ra.

Nếu bạn muốn biết đối tượng nào sẽ nhận sự kiện đó trước tiên hãy xem câu trả lời của siêu câu trả lời.

0

Tôi nghĩ rằng nếu tôi hiểu câu hỏi của bạn. Bạn có nghĩa là để yêu cầu đối tượng của bạn phơi bày một sự kiện mà người dùng của đối tượng của bạn có thể đăng ký. Nếu 10 người dùng khác nhau của đối tượng của bạn đã đăng ký sự kiện này và tại một số thời điểm bạn kích hoạt sự kiện, thứ tự xử lý sự kiện (hoặc đồng thời) sẽ được gọi ra là gì?

Trả lời: Kể từ khi xử lý sự kiện xảy ra trên cùng một luồng người phát sinh nó (trong trường hợp này chuỗi xử lý của đối tượng) chỉ có thể xử lý một hàm xử lý tại một thời điểm. Lệnh này không được bảo đảm (có nghĩa là không nhất thiết phải thuê bao đầu tiên sẽ được thực thi đầu tiên và cuối cùng sẽ được thực thi cuối cùng). Tôi mong bạn trả lời câu hỏi này. Điểm mấu chốt là tất cả 10 xử lý sẽ được gọi và không có gì sẽ được song song. Chúng sẽ được thực hiện cái khác. Tôi đã thấy mọi người vô tình đăng ký để lưu sự kiện hai lần và sau đó thấy hành động xảy ra hai lần và gặp khó khăn trong việc tìm ra lý do tại sao một số điều đang xảy ra nhiều lần.

3

Nếu theo "sự kiện", bạn có nghĩa là sự kiện đồng bộ hóa Win32 (đó là cách tôi đọc câu hỏi) thì nó phụ thuộc vào cách EventWaitHandle được tạo. Nếu đặt lại thủ công, sự kiện sẽ báo hiệu tất cả các chuỗi và tất cả các chuỗi sẽ thực thi. Nếu thiết lập lại tự động của nó, một sợi đơn sẽ được báo hiệu và thực thi. Bất kỳ chủ đề nào trong số 10 chủ đề của bạn đang chờ sự kiện có thể được chọn.

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