69

Tôi đang xây dựng một ứng dụng Windows Store và tôi có một số mã cần được đăng lên chuỗi giao diện người dùng.Cách chính xác để lấy CoreDispatcher trong một ứng dụng Windows Store

Đối với điều đó, tôi muốn truy xuất CoreDispatcher và sử dụng nó để đăng mã.

Dường như có một vài cách để làm như vậy:

// First way 
Windows.ApplicationModel.Core.CoreApplication.GetCurrentView().CoreWindow.Dispatcher; 

// Second way 
Window.Current.Dispatcher; 

Tôi tự hỏi cái nào là đúng? hoặc nếu cả hai đều tương đương nhau?

+2

Cả hai đều là * loại * chính xác, nhưng nó sẽ không có giá trị nếu bạn không truy cập từ thứ gì đó đã * có * truy cập vào Bộ điều phối. Nếu bạn muốn sử dụng nó trong, ví dụ, một ViewModel hoặc Controller, thì bạn sẽ cần phải lưu trữ Dispatcher, thường là một thuộc tính tĩnh trong App.xaml.cs hoặc IOC controller của bạn, và thiết lập nó từ trang đầu tiên bạn đã tải. –

Trả lời

113

Đây là cách ưa thích:

Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, 
() => 
{ 
    // Your UI update code goes here! 
}); 

Ưu điểm này có là nó được chính CoreApplicationView và do đó luôn luôn có sẵn. Thêm chi tiết here.

Có hai lựa chọn thay thế mà bạn có thể sử dụng.

thay thế đầu tiên

Windows.ApplicationModel.Core.CoreApplication.GetCurrentView().CoreWindow.Dispatcher 

này nhận được cái nhìn tích cực đối với các ứng dụng, nhưng điều này sẽ cung cấp cho bạn rỗng, nếu không có quan điểm đã được kích hoạt. Chi tiết hơn here.

Thứ hai thay thế

Window.Current.Dispatcher 

Giải pháp này sẽ không hoạt động khi nó được gọi là từ thread khác như nó trả rỗng thay vì UI Dispatcher. Thêm chi tiết here.

+0

Tôi đã thử điều này nhưng khi tôi theo dõi mã, mã đại biểu vẫn đang thực hiện trên một chuỗi công việc chứ không phải là "Chủ đề chính". –

+3

Xin lưu ý rằng (ít nhất trong Windows 8.1) DispatcherPriority hiện là CoreDispatcherPriority – Illidan

+0

Ngắn gọn! Điển hình của Microsoft sang trọng. – devios1

3
await CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(
      CoreDispatcherPriority.Normal, 
      () => { // your code should be here}); 
10

Đối với bất cứ ai sử dụng C++/CX

Windows::ApplicationModel::Core::CoreApplication::MainView->CoreWindow->Dispatcher->RunAsync(
    CoreDispatcherPriority::Normal, 
    ref new Windows::UI::Core::DispatchedHandler([this]() 
{ 
    // do stuff 
})); 
+1

Đó là C++/CX, không phải C++. Sự khác biệt là có liên quan, vì có một phép chiếu C++ chuẩn cho Windows Runtime: [C++/WinRT] (https://github.com/Microsoft/cppwinrt). – IInspectable

+0

Điểm tốt - được cập nhật! –

0

Thực ra, tôi sẽ đề nghị một cái gì đó trong dòng này:

return (Window.Current == null) ? 
    CoreApplication.MainView.CoreWindow.Dispatcher : 
    CoreApplication.GetCurrentView().CoreWindow.Dispatcher 

Bằng cách đó, bạn nên đã openend Xem thêm/Cửa sổ, bạn sẽ không nhận được các Dispatchers bối rối ...

Điều này đá quý nhỏ kiểm tra xem có thậm chí là một cửa sổ. Nếu không, hãy sử dụng Trình điều phối của MainView. Nếu có chế độ xem, hãy sử dụng Trình điều phối của một người đó.