2009-05-22 31 views
10

Tôi muốn gọi số WaitHandle.WaitOne(TimeSpan) trong .NET, nhưng tôi đang ở trên chuỗi STA và nó sẽ gửi tin nhắn trong khi đợi. Vì những lý do vượt quá phạm vi của câu hỏi này, tôi cần đợi mà không cần bơm. Làm thế nào tôi có thể chờ đợi một WaitHandle được báo hiệu mà không cần bơm tin nhắn?Làm thế nào để chờ đợi trên WaitHandle mà không cần bơm tin nhắn?

Dường như trong một số trường hợp mà WaitHandle.WaitOne không bơm thông báo. Nhưng đôi khi nó có một số thông điệp. Xem những liên kết này để biết thêm thông tin về rằng:

  1. Managed and Unmanaged Threading in Microsoft Windows
  2. Managed blocking
+0

tôi biết câu hỏi đã được trả lời, nhưng bạn có thể đưa ra một công thức chứng minh rằng WaitHandle.WaitOne có bơm tin nhắn không? Tôi không thực sự hiểu những gì đang xảy ra ở đây và tôi tò mò. –

+0

wcoenen: Tôi đã thêm các liên kết trong câu hỏi của tôi cho biết rằng WaitOne đôi khi bơm tin nhắn. –

Trả lời

8

WaitForSingleObject hoặc WaitForMultipleObjects là chờ đợi không bơm; sử dụng p/gọi.

[DllImport("kernel32", SetLastError=true, ExactSpelling=true)] 
public static extern Int32 WaitForSingleObject(SafeWaitHandle handle, Int32 milliseconds); 

-Oisin

+0

Cảm ơn. Tôi không biết bạn có thể vượt qua một SafeWaitHandle trực tiếp vào một phương pháp P/Invoke. Thật tuyệt. Cảm ơn vì tiền hỗ trợ. –

+0

Vâng, .NET marshaller "biết" về các loại để lộ IntPtr (GetDangerousHandle trong trường hợp này, iirc), vì vậy bạn chỉ có thể thay thế tham số đó trong chữ ký và để cho phép thuật xảy ra ;-) – x0n

+0

Vì một số lý do, giới hạn bơm được thực hiện bởi WaitOne() ngăn ngừa các hình thức thu nhỏ được khôi phục khi gọi WaitOne() trong Form.OnActivated. Đã cho tôi 2 giờ để theo dõi lỗi đó xuống cuộc gọi WaitOne(), nhưng nhờ câu trả lời của bạn ở đây tôi có thể sửa nó nhanh chóng :) Cảm ơn! – Daniel

3

Rõ ràng đây là một change introduced in Microsoft Vista: CoWaitForMultipleHandles tại công văn WM_PAINT tin nhắn.

Vista bug report.

Giải pháp thay thế là sử dụng Bộ công cụ tương thích ứng dụng của Microsoft để đặt cờ DisableNewWMPAINTDispatchInOLE cho ứng dụng của bạn.

1

Nếu bạn đang ở trong một ứng dụng WPF nơi Dispatcher là một trong những hoạt động được thông báo bơm chờ đợi trong quản lý, cách đơn giản nhất để vô hiệu hóa các máy bơm thông điệp trong chờ đợi của bạn là thông qua Dispatcher.DisableProcessing:

// The Dispose() method is called at the end of the using statement. 
// Calling Dispose on the DispatcherProcessingDisabled structure, 
// which is returned from the call to DisableProcessing, will 
// re-enable Dispatcher processing. 
using (Dispatcher.CurrentDispatcher.DisableProcessing()) 
{ 
    // Do work while the dispatcher processing is disabled. 
    Thread.Sleep(2000); 
} 
Các vấn đề liên quan