回答
用途:
從你的UI線程,執行:
var dispatcher = Windows.UI.Core.CoreWindow.GetForCurrentThread().Dispatcher;
從你的背景(非UI線程)
dispatcher.RunAsync(DispatcherPriority.Normal,
<lambda for your code which should run on the UI thread>);
,應該在兩個CP及更高版本的基礎之上。
有沒有辦法在非UI線程上獲得調度程序?目前,我從CoreWindow.GetForCurrentThread() – Grigory
中得到空號。調度程序綁定到一個UI線程,因此您需要在UI線程上檢索調度程序。一旦調度員被檢索到,你可以記住它。如果您在XAML應用程序中,那麼大多數UI對象都具有您可以使用的調度程序成員。 –
那麼我的應用程序的哪些部分實際上在UI線程中運行? 我使用的是FrameWorkView(視窗:應用模型::核心:: IFrameworkView),並且不能使用我從運行()所獲得的調度員 - 方法。當我嘗試通過RunAsync創建MediaElement時,出現WrongThreadException。 – Habba
用途:
this.Dispatcher.RunAsync(CoreDispatcherPriority.Normal,() => Frame.Navigate(typeof(Welcome), this));
這對我的作品。
這確實實際上並不保證在UI線程上運行它。它只會在「this」是UI上下文中的一個對象時纔會發生。 – Luke
在我看來,這是一種更簡單的方法。
獲取與UI關聯的TaskScheduler。
var UISyncContext = TaskScheduler.FromCurrentSynchronizationContext();
然後啓動一個新的任務和上面的UISyncContext。
Task.Factory.StartNew(() => { /* Do your UI stuff here; */}, new System.Threading.CancellationToken(), TaskCreationOptions.PreferFairness, UISyncContext);
它更容易直接得到CoreWindow從非UI線程。以下代碼無處不在,即使當GetForCurrentThread()
或Window.Current
返回null。
CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal,
<lambda for your code which should run on the UI thread>);
例如:
CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal,
() =>
{
// Your UI update code goes here!
});
你需要引用Windows.ApplicationModel.Core
命名空間:
using Windows.ApplicationModel.Core;
DispatcherTimer也是一種選擇。
我用它必須在XAML的設計師來運行代碼(CoreWindow.Dispatcher,......不可在UWP-設計師)
var localTimer = new DispatcherTimer
{
Interval = TimeSpan.FromMilliseconds(0)
};
localTimer.Tick += (timer, e) =>
{
(timer as DispatcherTimer).Stop();
action();
};
localTimer.Start();
免責聲明:
我要指出,這應該如果其他所有人都失敗了,那麼這是最後的選擇。
在UWP上,我試圖設置CaptureElement控件的Source屬性(在XAML中定義)時遇到問題,它正在抱怨準備在不同的線程中,即使我試圖從代碼中設置它通過Page_Loaded事件處理程序調用。我最終使用它來解決它:
previewControl.Dispatcher.TryRunAsync(CoreDispatcherPriority.Normal,() => {
previewControl.Source = _mediaCapture;
}).GetAwaiter().GetResult();
- 1. 在UI線程上運行代碼
- 2. 在Cocos2dx的主/ UI線程上運行代碼
- 3. 可以在UI線程上運行BeginInvoke中斷代碼嗎?
- 4. 編輯代碼以在UI線程上運行?
- 5. Observable仍然在UI線程上運行
- 6. 在UI線程上運行什麼?
- 7. 這是否在UI線程上運行
- 8. 是否SimpleCursorAdapter在UI線程上運行
- 9. 在不存在控制對象的UI線程上運行代碼
- 10. 在非UI線程中運行代碼android
- 11. 此代碼是否會在UI線程中運行?
- 12. UI線程都運行消息泵並執行代碼?
- 13. 如何在Android上的後臺線程上運行代碼?
- 14. 如何在.net中的主UI線程以外的線程上運行UI?
- 15. 新線程運行的UI線程
- 16. 如何在UI線程上執行一些代碼
- 17. 在特定線程中運行代碼
- 18. 即使在使用工作線程時也在UI線程上運行的Android代碼
- 19. 計劃在UI線程vs UI上運行的TPL任務線程
- 20. 確保在ui線程上運行異步線程
- 21. 在線運行Java代碼
- 22. 在線運行C++代碼?
- 23. 在線運行rails代碼
- 24. 從WinRT中的線程更新UI
- 25. 在單獨的線程上運行一段代碼
- 26. 如何確保代碼在vb.net的主線程上運行?
- 27. 在工作線程的主線程中運行一些代碼
- 28. 移動在UI線程上運行的代碼並將全局狀態訪問到線程
- 29. 運行多線程的VB.NET代碼
- 30. 運行多個UI線程
請注意未來的讀者:請記住,如果您的應用程序有多個窗口 - 有多個UI線程和調度程序。 –