我怎样才能在WinRT中(Windows 8的地铁)UI线程上运行代码?
该Invoke
方法不存在。
我怎样才能在WinRT中(Windows 8的地铁)UI线程上运行代码?
该Invoke
方法不存在。
它更容易获得直接从非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;
使用:
从你的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及更高版本的基础之上。
使用:
this.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => Frame.Navigate(typeof(Welcome), this));
这个对我有用。
这在我看来是一个更简单的方法。
获取与UI相关的TaskScheduler。
var UISyncContext = TaskScheduler.FromCurrentSynchronizationContext();
然后开始新的任务和上述UISyncContext。
Task.Factory.StartNew(() => { /* Do your UI stuff here; */}, new System.Threading.CancellationToken(), TaskCreationOptions.PreferFairness, UISyncContext);
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();