我開發了一個通用應用程序,它使用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))」
我這樣尋找解決方案,以解決它:
- 使用 「Dispatcter」,就像是在這裏(WinRT - MessageDialog.ShowAsync will throw UnauthorizedAccessException in my custom class)推薦
的代碼是:
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();
});
}
}
=>但我總能在相同的異常。
- 使用 「IAsyncOperation」 命令以關閉前MessageDialog,像這裏(MessageDialog ShowAsync throws accessdenied exception on second dialog)
有了這個代碼建議:
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);
});
}
}
=>但是在這種情況下,我也總是得到相同的異常。
- 使用延長排隊messagedialogs,如描述在這裏(Multiple MessageDialog app crash)
的代碼現在:
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個第一解決方案,似乎更適應