2010-06-18 15 views

Trả lời

16

AFAIK, khi sử dụng WPF, đối tượng SynchronizationContext.Current là loại DispatcherSynchronizationContext mà thực sự chỉ là một wrapper xung quanh đối tượng Dispatcher và PostSend phương pháp chỉ uỷ thác cho Dispatcher.BeginInvokeDispatcher.Invoke.

Vì vậy, ngay cả khi bạn quyết định sử dụng SynchronizationContext Tôi nghĩ bạn sẽ kết thúc cuộc gọi điều phối phía sau hậu trường.

Bên cạnh đó, tôi nghĩ rằng hơi phức tạp khi sử dụng SynchronizationContext vì bạn phải chuyển tham chiếu đến ngữ cảnh hiện tại cho tất cả các chuỗi cần phải gọi vào giao diện người dùng của bạn.

+3

Tại sao bạn nên downvote? –

4
  1. Sử dụng Bộ điều phối khi mã của bạn được ghép chặt với WPF.

  2. Sử dụng AsyncOperationManager khi bạn cần xếp thứ gì đó lên chuỗi 'Bối cảnh'. Điều này cũng làm việc với các ứng dụng Windows Forms, ASP .NET và WCF.

  3. Tránh tự mình sử dụng SynchronizationContext. AsyncOperationManager sử dụng mechnism này trong nội bộ.

+0

Tôi nhận ra bạn đã viết câu trả lời này một thời gian trước đây. Tuy nhiên, tôi sẽ rất quan tâm nếu bạn có thể cung cấp một ví dụ cụ thể về cách sử dụng 'AsyncOperationManager' để xếp hàng một delegate để thực hiện trên luồng "context" (UI). Tôi biết cách 'SynchronizationContext' hoạt động; nhưng tôi không thể hiểu được cách mà 'AsyncOperation' được cho là hoạt động. (Tôi hiện có khái niệm rằng nó giống như một "mã thông báo" để theo dõi trạng thái và tiến trình của hoạt động không đồng bộ, nhưng sẽ không giúp thực sự lên lịch cho một đại biểu thực hiện.) – stakx

+1

Cách sử dụng AsyncOperationManager: http: // www .codeproject.com/KB/cpp/SyncContextTutorial.aspx – jbe

+0

Điều gì sẽ xảy ra nếu bạn cần chạy đồng bộ một cái gì đó trên chuỗi giao diện người dùng? AsyncOperation không có phương thức Send() nhưng SynchronizationContext thực hiện. – Monstieur