C# MessageDialog显示异步灾难性故障

C# MessageDialog显示异步灾难性故障,c#,uwp,C#,Uwp,我尝试使用从串行端口接收的数据更新主页UI。一旦收到数据,就会引发一个事件,因此我使用MVVMLight向主页发送一条消息,希望使用更新UI。这里可能出了什么问题 如果我尝试从主构造函数调用函数,或者甚至在引发串行事件后更新简单的TextBlock时,下面的示例工作得很好 根据描述,我认为发生这种情况是因为您没有在UIThread上创建MessageDialog。把它放在调度器里,一切都会好起来的 除此之外,您还可以检查是否从错误的上下文(例如,从不再显示的某个页面)调用此函数,但不太可能导致此

我尝试使用从串行端口接收的数据更新主页UI。一旦收到数据,就会引发一个事件,因此我使用MVVMLight向主页发送一条消息,希望使用更新UI。这里可能出了什么问题

如果我尝试从主构造函数调用函数,或者甚至在引发串行事件后更新简单的TextBlock时,下面的示例工作得很好


根据描述,我认为发生这种情况是因为您没有在
UIThread
上创建
MessageDialog
。把它放在调度器里,一切都会好起来的


除此之外,您还可以检查是否从错误的上下文(例如,从不再显示的某个页面)调用此函数,但不太可能导致此问题。

您的第一个假设是正确的!但这不是绝对的情况,或者换句话说,它不适用于在调度程序内部使用时在调度程序外部声明的所有变量。有什么解释吗@usefulBee这是UI元素的情况。您应该在调度程序中创建它们。当然,非UI对象或变量(如字符串)可以在任何地方创建并在Dispatcher中使用。
private void OnMsgRecieved(PortMsg obj)
{
    ShowDialog(obj.StringID);
}

private async void ShowDialog(string msg)
{
    var dlg = new MessageDialog(msg);
    try
    {
      await Dispatcher.RunAsync(CoreDispatcherPriority.High, async () =>
        {
          await dlg.ShowAsync();
        });
    }
    catch (Exception exc)
    {
      // Catastrophic Failure
    }
}