在WinRT中的UI线程上运行代码

ofe*_*fer 65 .net multithreading dispatcher windows-8 windows-runtime

如何在WinRT(Windows 8 Metro)中的UI线程上运行代码?

Invoke方法不存在.

Cœu*_*œur 79

从非UI线程直接获取CoreWindow更容易.以下代码可以在任何地方使用,即使是GetForCurrentThread()Window.Current返回null.

CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal,
    <lambda for your code which should run on the UI thread>);
Run Code Online (Sandbox Code Playgroud)

例如:

CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal,
    () =>
    {
        // Your UI update code goes here!
    });
Run Code Online (Sandbox Code Playgroud)

您需要引用Windows.ApplicationModel.Core命名空间:

using Windows.ApplicationModel.Core;
Run Code Online (Sandbox Code Playgroud)


Rei*_*man 69

使用:

从您的UI线程,执行:

var dispatcher = Windows.UI.Core.CoreWindow.GetForCurrentThread().Dispatcher;
Run Code Online (Sandbox Code Playgroud)

从你的背景(非UI线程)

dispatcher.RunAsync(DispatcherPriority.Normal, 
    <lambda for your code which should run on the UI thread>);
Run Code Online (Sandbox Code Playgroud)

这应该适用于CP和后期版本.

  • 有没有办法在非UI线程上获得调度程序?目前我从CoreWindow.GetForCurrentThread()获取null (5认同)
  • @Larry:您可以从后台线程获取Dispatcher,请参见此处:http://stackoverflow.com/a/25760799/543303`CoreApplication.MainView.CoreWindow.Dispatcher` (4认同)
  • 否.调度程序与UI线程绑定,因此您需要在UI线程上检索调度程序.一旦检索到调度程序,您就可以记住它.如果您在XAML应用程序中,则大多数UI对象都具有您可以使用的调度程序成员. (3认同)

小智 8

使用:

this.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => Frame.Navigate(typeof(Welcome), this));
Run Code Online (Sandbox Code Playgroud)

这个对我有用.

  • 这实际上并不能保证在UI线程上运行它.只有"this"是UI上下文中的对象才会出现. (5认同)

Dee*_*eeb 5

在我看来,这是一种更容易的方法.

获取与UI关联的TaskScheduler.

    var UISyncContext = TaskScheduler.FromCurrentSynchronizationContext();
Run Code Online (Sandbox Code Playgroud)

然后在上面的UISyncContext上启动一个新任务.

    Task.Factory.StartNew(() => { /* Do your UI stuff here; */}, new System.Threading.CancellationToken(), TaskCreationOptions.PreferFairness, UISyncContext);
Run Code Online (Sandbox Code Playgroud)