Sau khi yêu cầu this question, tôi tự hỏi liệu có thể chờ một sự kiện được kích hoạt hay không và sau đó lấy dữ liệu sự kiện và trả lại một phần. Sắp xếp như thế này:Làm thế nào để chặn cho đến khi một sự kiện được kích hoạt trong C#
private event MyEventHandler event;
public string ReadLine(){ return event.waitForValue().Message; }
...
event("My String");
...elsewhere...
var resp = ReadLine();
Hãy đảm bảo mọi giải pháp bạn cung cấp đều trả về giá trị trực tiếp thay vì lấy từ giá trị khác. Tôi hỏi liệu phương pháp trên có sẵn theo một cách nào đó không. Tôi biết về Auto/ManuelResetEvent, nhưng tôi không biết rằng họ trả về giá trị trực tiếp như tôi đã làm ở trên.
Cập nhật: Tôi đã khai báo sự kiện bằng cách sử dụng MyEventHandler
(có chứa trường Message
). Tôi có một phương pháp trong một chủ đề khác gọi là ReadLine
đang chờ sự kiện kích hoạt. Khi sự kiện kích hoạt phương thức WaitForValue (một phần của cảnh xử lý sự kiện) trả về sự kiện args, chứa thông báo. Thông điệp này sau đó được trả về bởi ReadLine cho bất cứ điều gì đã gọi nó.
The accepted answer to that question Tôi hỏi là những gì tôi đã làm, nhưng nó không cảm thấy hoàn toàn đúng. Nó gần như cảm thấy như một cái gì đó có thể xảy ra với dữ liệu giữa việc bắn ManuelResetEvent và chương trình lấy dữ liệu và trả lại dữ liệu đó.
Cập nhật: Vấn đề chính với Auto/ManualResetEvent
là sự cố quá dễ bị tổn thương. Một chủ đề có thể chờ đợi sự kiện, và sau đó không cung cấp đủ thời gian cho bất cứ ai khác để có được nó trước khi thay đổi nó để cái gì khác. Có cách nào để sử dụng ổ khóa hay cái gì khác không? Có thể sử dụng get và set statement.
những gì về một vòng lặp while: 'while (someGlobalvar);' cahnge 'someGlobalvar' trong một chức năng bạn asign đến sự kiện này. – elyashiv
nó đang hoạt động chờ đợi, và nó là một giải pháp rất xấu –
Bây giờ, 2 năm sau, có vẻ như tôi chỉ nên làm WaitTwo mà sẽ trả về một đối tượng, và '* ResetEvent.Set (dữ liệu đối tượng)'. Tôi vẫn sẽ cần phải lo lắng về tham chiếu đối tượng, nhưng đó là bình thường. Ít nhất con trỏ sẽ không thay đổi. –