Xaml UWP-Dispatcher DispatchedHandler如何在工作线程上运行?
我正试图通过Dispatcher从后台线程更新一些UWP UI。 但是,传递给RunAsync方法的处理程序仍然在backlground线程上执行 我不知道如何解决这个问题——我错过了什么吗 --编辑-- 我只有一个窗口,即Xaml UWP-Dispatcher DispatchedHandler如何在工作线程上运行?,xaml,uwp,Xaml,Uwp,我正试图通过Dispatcher从后台线程更新一些UWP UI。 但是,传递给RunAsync方法的处理程序仍然在backlground线程上执行 我不知道如何解决这个问题——我错过了什么吗 --编辑-- 我只有一个窗口,即window.Current 我尝试了社区工具包DispatcherHelper类,但仍然得到了完全相同的异常 private static async void OnSelectedItemChanged(DependencyObject d, DependencyPro
window.Current
我尝试了社区工具包DispatcherHelper类,但仍然得到了完全相同的异常
private static async void OnSelectedItemChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var panel = (SidePanelInfo) d;
var x = e.NewValue as TaskItemViewModel;
await DispatcherHelper.ExecuteOnUIThreadAsync(() =>
{
panel.DescriptionBox.Document.SetText(TextSetOptions.FormatRtf, x?.Description ?? "");
});
}
如果您已经在后台线程上,则无法访问
Window.Current.Dispatcher
,因为后台线程没有设置Window.Current
(该属性获取与调用它的UI线程关联的Window
实例)
相反,您应该首先在UI线程上检索Dispatcher
实例,然后使用此实例执行RunAsync
但是-OnSelectedItemChanged
更像是一个UI事件处理程序,在这种情况下,您不需要在UI线程上运行代码。例如,当从按钮触发时,使用相同的参数运行面板.DescriptionBox.Document.SetText
,检查是否未经授权的访问异常未发生
多视图和多窗口应用程序
在创建多视图或多窗口UWP应用程序时可能会出现问题,因为在UWP中,每个窗口都有自己的UI线程。这意味着,当您要跨窗口更新属性时,始终需要使用目标窗口/应用程序视图的调度程序 如果您已经在后台线程上,则无法访问Window.Current.Dispatcher
,因为后台线程没有设置Window.Current
(属性获取与调用它的UI线程相关联的Window
实例)
相反,您应该首先在UI线程上检索Dispatcher
实例,然后使用此实例执行RunAsync
但是-OnSelectedItemChanged
更像是一个UI事件处理程序,在这种情况下,您不需要在UI线程上运行代码。例如,当从按钮触发时,使用相同的参数运行面板.DescriptionBox.Document.SetText
,检查是否未经授权的访问异常未发生
多视图和多窗口应用程序
在创建多视图或多窗口UWP应用程序时可能会出现问题,因为在UWP中,每个窗口都有自己的UI线程。这意味着,当您要跨窗口更新属性时,始终需要使用目标窗口/应用程序视图的调度程序 来自Windows社区工具包的在这里非常有用
它为您提供了在UI线程上执行代码或在MainView上执行代码的选项(如果您有多个窗口)
DispatcherHelper.ExecuteOnUIThreadAsync(()=>
{
//要在主窗口的UI线程上执行的代码
});
wait CoreApplication.MainView.Dispatcher.waitiablerunasync(()=>
{
});
来自Windows社区工具包的在这里非常有用
它为您提供了在UI线程上执行代码或在MainView上执行代码的选项(如果您有多个窗口)
DispatcherHelper.ExecuteOnUIThreadAsync(()=>
{
//要在主窗口的UI线程上执行的代码
});
wait CoreApplication.MainView.Dispatcher.waitiablerunasync(()=>
{
});
好的,我终于知道发生了什么,这不是我所期望的
该问题与线程或调度程序无关,尽管调度程序在工作线程上执行(UWP调度程序似乎不像WPF那样在主线程上运行),尽管该错误与您在出现跨线程UI异常时预期的错误相同
原来我有一个RichEditBox,它不经意间处于只读模式。因为这个控件不支持绑定到它的内容,所以我在代码隐藏中设置了内容。异常是因为我在只读模式下设置控件的文本
遗憾的是,该控件不能给出一个更有意义的错误,或者即使在只读模式下也不能以编程方式进行编辑,就像WPF等价物一样。但你来了。希望这个问答页面能帮助其他有同样问题的人
非常感谢Martin Zikmund在我确定这是一个调度问题时试图帮助我。好的,我终于知道发生了什么,这不是我所期望的
该问题与线程或调度程序无关,尽管调度程序在工作线程上执行(UWP调度程序似乎不像WPF那样在主线程上运行),尽管该错误与您在出现跨线程UI异常时预期的错误相同
原来我有一个RichEditBox,它不经意间处于只读模式。因为这个控件不支持绑定到它的内容,所以我在代码隐藏中设置了内容。异常是因为我在只读模式下设置控件的文本
遗憾的是,该控件不能给出一个更有意义的错误,或者即使在只读模式下也不能以编程方式进行编辑,就像WPF等价物一样。但你来了。希望这个问答页面能帮助其他有同样问题的人
非常感谢Martin Zikmund在我确定这是一个调度问题时帮助我。您是否尝试过在没有调度程序的情况下设置文本?是的。我添加了dispatcher调用以尝试并修复,因为这看起来像是所有XAML controlsive在live visual树中常见的跨线程异常,而且肯定只有一个窗口。我自己会更深入地研究这个不
DispatcherHelper.ExecuteOnUIThreadAsync<T>(() =>
{
// Code to execute on main window's UI thread
});
await CoreApplication.MainView.Dispatcher.AwaitableRunAsync<T>( () =>
{
});