在WinRT的UI线程中运行代码在WinRT的UI线程中运行代码(Run code on UI th

2019-05-14 02:11发布

我怎样才能在WinRT中(Windows 8的地铁)UI线程上运行代码?

Invoke方法不存在。

Answer 1:

它更容易获得直接从非UI线程CoreWindow。 下面的代码将工作无处不在,即使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;


Answer 2:

使用:

从你的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及更高版本的基础之上。



Answer 3:

使用:

this.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => Frame.Navigate(typeof(Welcome), this));

这个对我有用。



Answer 4:

这在我看来是一个更简单的方法。

获取与UI相关的TaskScheduler。

    var UISyncContext = TaskScheduler.FromCurrentSynchronizationContext();

然后开始新的任务和上述UISyncContext。

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


Answer 5:

DispatcherTimer也是一种选择。

我用它必须在XAML的设计师来运行代码(CoreWindow.Dispatcher,......不可在UWP-设计师)

var localTimer = new DispatcherTimer
{
    Interval = TimeSpan.FromMilliseconds(0)
};
localTimer.Tick += (timer, e) =>
{
    (timer as DispatcherTimer).Stop();
    action();
};
localTimer.Start();

免责声明:
我要指出,这应该是一个不得已的选择,如果所有其他失败。



Answer 6:

上UWP,我是有问题的尝试设置CaptureElement控制的Source属性(即在XAML定义),将其抱怨在不同的线程正在准备,即使我试图从被经由PAGE_LOADED调用代码设置它事件处理程序。 最后我用这个来解决它:

previewControl.Dispatcher.TryRunAsync(CoreDispatcherPriority.Normal, () => {
   previewControl.Source = _mediaCapture;
}).GetAwaiter().GetResult();


文章来源: Run code on UI thread in WinRT