1

我開發了一個通用應用程序,它使用MVVM-Light。我叫Web服務從的ViewModels,我扔通過在Web服務到的ViewModels呼叫遇到的例外:超時錯誤的URL,服務器異常,...在Windows Phone 8.1下多次調用MessageDialog會導致崩潰

我創建了一個類「ExceptionsMsgHelper .cs「,它通過MessageDialog集中顯示每個例外的消息。

我的主頁基於包含多個數據的Pivot:某些WebServices被異步調用。如果我通過類「ExceptionsMsgHelper.cs」在MessageDialog中顯示異常,則會遇到崩潰,而以前的異常也會顯示在另一個MessageDialog中。

這是我原來的類的一部分:

public class ExceptionsMsgHelper 
    { 
     public async static void MsgboxWebserviceErrors(WebServiceErrorsException wseE, string errors) 
     { 
      Windows.UI.Popups.MessageDialog msgbox = 
      new Windows.UI.Popups.MessageDialog("The Websercice '" + wseE.WebService + "' has returned errors : \n" + errors, 
       "Unexpected data");   
      await msgbox.ShowAsync(); 
     } 
    } 

=>如果我叫兩次 「msgbox.ShowAsync()」,我得到了一下 「System.UnauthorizedAccessException」 異常:有消息「訪問被拒絕。(異常來自HRESULT:0X80070005(E_ACCESSDENIED))」

我這樣尋找解決方案,以解決它:

的代碼是:

public class ExceptionsMsgHelper 
    { 
     public async static void MsgboxWebserviceErrors(WebServiceErrorsException wseE, string errors) 
     { 
      Windows.UI.Popups.MessageDialog msgbox = 
      new Windows.UI.Popups.MessageDialog("The Websercice '" + wseE.WebService + "' has returned errors : \n" + errors, 
       "Unexpected data");   
      CoreDispatcher dispatcher = CoreWindow.GetForCurrentThread().Dispatcher; 
      dispatcher.RunAsync(CoreDispatcherPriority.Normal, async() => 
      { 
       await msgbox.ShowAsync(); 
      }); 
     } 
    } 

=>但我總能在相同的異常。

有了這個代碼建議:

public class ExceptionsMsgHelper 
    { 
     private static IAsyncOperation<IUICommand> messageDialogCommand = null; 
     public async static Task<bool> ShowDialog(MessageDialog dlg) 
     { 

      // Close the previous one out 
      if (messageDialogCommand != null) 
      { 
       messageDialogCommand.Cancel(); 
       messageDialogCommand = null; 
      } 

      messageDialogCommand = dlg.ShowAsync(); 
      await messageDialogCommand; 
      return true; 
     } 

     public async static void MsgboxWebserviceErrors(WebServiceErrorsException wseE, string errors) 
     { 
      Windows.UI.Popups.MessageDialog msgbox = 
      new Windows.UI.Popups.MessageDialog("The Websercice '" + wseE.WebService + "' has returned errors : \n" + errors, 
       "Unexpected data");   
      CoreDispatcher dispatcher = CoreWindow.GetForCurrentThread().Dispatcher; 
      dispatcher.RunAsync(CoreDispatcherPriority.Normal, async() => 
      { 
       await ShowDialog(msgbox); 
      }); 
     }   
    } 

=>但是在這種情況下,我也總是得到相同的異常。

的代碼現在:

public class ExceptionsMsgHelper 
    { 
     public async static void MsgboxWebserviceErrors(WebServiceErrorsException wseE, string errors) 
     { 
      Windows.UI.Popups.MessageDialog msgbox = 
      new Windows.UI.Popups.MessageDialog("The Websercice '" + wseE.WebService + "' has returned errors : \n" + errors, 
       "Unexpected data"); 
      await MessageDialogExtensions.ShowAsyncQueue(msgbox); 
     } 
    } 

    public static class MessageDialogExtensions 
    { 
     private static TaskCompletionSource<MessageDialog> _currentDialogShowRequest; 
     public static async Task<IUICommand> ShowAsyncQueue(this MessageDialog dialog) 
     { 
      if (!Window.Current.Dispatcher.HasThreadAccess) 
      { 
       throw new InvalidOperationException("This method can only be invoked from UI thread."); 
      } 

      while (_currentDialogShowRequest != null) 
      { 
       await _currentDialogShowRequest.Task; 
      } 

      var request = _currentDialogShowRequest = new TaskCompletionSource<MessageDialog>(); 
      var result = await dialog.ShowAsync(); 
      _currentDialogShowRequest = null; 
      request.SetResult(dialog); 

      return result; 
     } 
    private static IAsyncOperation<IUICommand> messageDialogCommand = null; 
    public async static Task<bool> ShowDialog(this MessageDialog dlg) 
    { 

     // Close the previous one out 
     if (messageDialogCommand != null) 
     { 
      messageDialogCommand.Cancel(); 
      messageDialogCommand = null; 
     } 

     messageDialogCommand = dlg.ShowAsync(); 
     await messageDialogCommand; 
     return true; 
    } 

    #endregion 
    } 

=>並且這適用於我。

但喜歡說,它的作者,這可能不是最好的解決辦法:

關閉現有的對話,當你需要打開一個新的。這是最簡單的選擇,也可能是最好的選擇,儘管您可能會冒失敗的風險取決於您的對話是關於什麼重要的對話。 排隊對話使舊的不會被解僱,但新的解僱之後就會出現。這將確保用戶關閉所有對話框,但如果您的應用程序可以以某種方式開始顯示數百個對話框,則可能會出現問題。 如果還沒有顯示,請只打開一個新的。現在這冒着一條新消息未被顯示的風險,這聽起來比第一個選項更成問題。

=>我想知道爲什麼我不能申請一個2個第一解決方案,似乎更適應

回答

2

Ofcourse就可以不顯示2個或更多時消息對話框同時(windows手機限制)。此外,Windows Phone 8.1上的MesssageDialog可能存在錯誤,無法關閉。

如果關閉上一個對話框將是您的解決方案,請嘗試使用ContentDialog而不是MessageDialog。檢查我在這個主題的答案:Closing MessageDialog programatically in WP 8.1 RT

我認爲它解決了你的問題。

相關問題