2017-06-06 44 views
-2

我尝试使用从串行端口接收的数据更新MainPage UI。一旦收到数据,就会引发一个事件,所以我使用MVVMLight向MainPage发送一条消息,希望能够更新UI。这里有什么可能是错的?MessageDialog ShowAsync灾难性故障

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

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 
    } 
} 

回答

3

根据其描述,我认为这是因为你不UIThread创建MessageDialog。把它放在Dispatcher里面,一切都应该没问题。

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

+0

你的第一个假设是正确的!但这不是绝对的情况,换句话说,它并不适用于在调度程序内部使用的所有变量。任何解释?! – usefulBee

+1

@usefulBee UI元素就是这种情况。您应该在分派器中创建它们。当然,非UI对象或像字符串这样的变量可以在任何地方创建并在Dispatcher中使用。 –

相关问题