Xaml UWP-Dispatcher DispatchedHandler如何在工作线程上运行?

Xaml UWP-Dispatcher DispatchedHandler如何在工作线程上运行?,xaml,uwp,Xaml,Uwp,我正试图通过Dispatcher从后台线程更新一些UWP UI。 但是,传递给RunAsync方法的处理程序仍然在backlground线程上执行 我不知道如何解决这个问题——我错过了什么吗 --编辑-- 我只有一个窗口,即window.Current 我尝试了社区工具包DispatcherHelper类,但仍然得到了完全相同的异常 private static async void OnSelectedItemChanged(DependencyObject d, DependencyPro

我正试图通过Dispatcher从后台线程更新一些UWP UI。 但是,传递给RunAsync方法的处理程序仍然在backlground线程上执行

我不知道如何解决这个问题——我错过了什么吗

--编辑--

我只有一个窗口,即
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>( () =>
{

});