Tôi có Biểu mẫu Windows có ListView trong Chế độ báo cáo. Đối với mỗi mục trong dạng xem, tôi cần thực hiện một thao tác chạy dài, kết quả là một số.Tương đương C# của MsgWaitForMultipleObjects là gì?
Cách tôi sẽ làm điều này trong win32 gốc là tạo một chuỗi công nhân cho mỗi mục (ngây thơ; tất nhiên tôi sẽ không tạo số chuỗi không bị chặn) và sau đó MsgWaitForMultipleObjects() trên mảng xử lý chuỗi. Khi mỗi phép tính kết thúc, tín hiệu luồng và chuỗi giao diện người dùng chính sẽ thức dậy và cập nhật. Trong thời gian đó, chúng tôi bơm các thông điệp để chuỗi giao diện người dùng vẫn đáp ứng.
Có ai có thể cung cấp ví dụ về cách thức hoạt động của tính năng này trong C# không? Tôi đã nhìn vào đối tượng Monitor, và nó không có vẻ là những gì tôi muốn - hoặc nó bơm thông điệp trong khi chặn?
Cảm ơn.
Chỉnh sửa: Có vẻ như WaitHandler.WaitAny() thực sự có thể bơm tin nhắn. Xem cbrumme's treatise khi bơm thông báo trong CLR.
Bạn nói đúng, Màn hình không bơm tin nhắn. WaitHandle có thể là một nơi tốt hơn để nhìn, nhưng tôi không thể tìm thấy một phương pháp WaitHandle cũng bơm tin nhắn. – itowlson
Vâng, tôi cũng thấy điều đó. Nó không phải là một yêu cầu hoặc là tôi có thể chờ đợi trên nhiều đối tượng. Tôi sẽ đợi một sự kiện hay một thứ gì đó ... Tôi không muốn chặn giao diện người dùng. Tất cả các mẫu tôi đã tìm thấy làm 'giấc ngủ (100)' hoặc một cái gì đó để buộc một chuyển đổi ngữ cảnh, mà là rất buồn. –
Tôi đoán vấn đề là trong WinForms vòng lặp tin nhắn không rõ ràng. Vì vậy, bạn không thể làm một MsgWaitX trực tiếp, thay vào đó bạn cần một cái gì đó mà sẽ nâng cao một sự kiện. Ví dụ, chạy từng subtask như một BackgroundWorker (và quên đi các nguyên thủy đồng bộ). – itowlson