Csharp/C#教程:由于捕获的exception,显示WinRT MessageDialog的正确方法是什么?分享


由于捕获的exception,显示WinRT MessageDialog的正确方法是什么?

由于捕获的exception,显示消息对话框的正确方法是什么?

我最初尝试过

try { await DoSomething(); } catch(InvalidOperation ex) { await MessageDialog(ex.Message).ShowAsync(); } catch(CommunicationException) { await MessageDialog(StringResourceLoader.LoginError).ShowAsync(); } 

这不起作用,因为你无法await try块内部。 取出await命令会使编译器显示以下警告:

由于不等待此调用,因此在完成调用之前会继续执行当前方法。 考虑将’await’运算符应用于调用的结果

我不喜欢在我的代码中保留这些警告,因为在几个地方人们忘记使用await因此很难找到错误。

将消息对话框语句更改为var task = new MessageDialog(ex.Message).ShowAsync().AsTask(); 摆脱所有的警告和错误,但我不确定这是一个很好的方式(并在技术上是坏的,因为它希望我await电话)

最后,我尝试通过以下方式存储exception并在catch之外执行我向用户显示的内容的逻辑(包括确定抛出什么类型的exception的所有逻辑):

 Exception thrownException = null; try { await DoSomething(); } catch(Exception ex) { thrownException = ex; } if (thrownException is InvalidOperationException) await MessageDialog(ex.Message).ShowAsync(); else if (thrownException is CommunicationException) await MessageDialog(StringResourceLoader.LoginError).ShowAsync(); 

我不确定我是否认为这是最好的方式。 有什么想法应该怎么做?

编辑:在Hans关于其他问题的评论之后,我最终通过创建以下类来解决它:

 public static class MessageDialogDisplayer { private static readonly ConcurrentQueue _dialogQueue; private static readonly CancellationTokenSource _cancellationTokenSource; static MessageDialogDisplayer() { _dialogQueue = new ConcurrentQueue(); _cancellationTokenSource = new CancellationTokenSource(); new Task(DisplayQueuedDialogs, _cancellationTokenSource.Token).Start(); } public static void DisplayDialog(MessageDialog dialog) { _dialogQueue.Enqueue(dialog); } private static async void DisplayQueuedDialogs() { const int millisecondsBetweenDialogChecks = 500; while (!_cancellationTokenSource.Token.IsCancellationRequested) { MessageDialog dialogToDisplay; if (_dialogQueue.TryDequeue(out dialogToDisplay)) { await dialogToDisplay.ShowAsync(); } else { await Task.Delay(millisecondsBetweenDialogChecks); } } } } 

这改变了我的try / catch语句

 MessageDialog errorDialog = null; try { await DoSomething(); } catch(InvalidOperation ex) { MessageDialogDisplayer.DisplayDialog(new MessageDialog(ex.Message)); } catch(CommunicationException) { MessageDialogDisplayer.DisplayDialog(new MessageDialog(StringResourceLoader.LoginError)); } 

这使得事情从长远来看更加稳定(一旦我将所有消息对话框调用者转换为使用它而不是showAsyncing本身)并使try / catch块变得更加混乱(imo)。

上述就是C#学习教程:由于捕获的exception,显示WinRT MessageDialog的正确方法是什么?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/1007380.html

(0)
上一篇 2021年12月29日
下一篇 2021年12月29日

精彩推荐