读书频道 > 网站 > 网页设计 > C#并发编程经典实例
2.9 处理async void方法的异常
14-12-06    下载编辑
收藏    我要投稿   

本文所属图书 > C#并发编程经典实例

本书全面讲解C 并发编程技术,侧重于 NET 平台上较新、较实用的方法。全书分为几大部分:首先介绍几种并发编程技术,包括异步编程、并行编程、TPL 数据流、响应式编程;然后阐述一些重要的知识点,包括测试技立即去当当网订购
问题
 
需要处理从async void 方法传递出来的异常。
 
解决方案
 
没有什么好的办法。如果可能的话,方法的返回类型不要用void,把它改为Task。某些情况下这是不可能的,例如,需要对一个ICommand 的实现(必须返回void)做单元测试。
 
这种情况下,可以为Execute 方法提供一个返回Task 类型的重载,就像这样:
 
sealed class MyAsyncCommand : ICommand
{
async void ICommand.Execute(object parameter)
{
await Execute(parameter);
}
public async Task Execute(object parameter)
{
... // 这里实现异步操作。
}
... // 其他成员(CanExecute 等)。
}
 
最好不要从async void 方法传递出异常。如果必须使用async void 方法,可考虑把所有代码放在try 块中,直接处理异常。
 
处理async void 方法的异常还有一个办法。一个异常从async void 方法中传递出来时,会在SynchronizationContext 中引发出来。当async void 方法启动时,SynchronizationContext就处于激活状态。如果系统运行环境支持SynchronizationContext,通常就可以在全局范围内处理这些顶层的异常。例如,WPF有Application.DispatcherUnhandledException,WinRT有Application.UnhandledException,ASP.NET 有Application_Error。
 
通过控制SynchronizationContext,也可以处理从async void 方法传出的异常。自己编写SynchronizationContext 的工作量太大,可以使用免费的NuGet 库Nito.AsyncEx,里面有AsyncContext 类。AsyncContext 可以在没有自带SynchronizationContext 的场合发挥作用,例如控制台程序、Win32 服务程序。下面的例子是在控制台程序中使用AsyncContext,其中async 方法不返回Task,但AsyncContext 仍能在async void 方法中起作用:
 
static class Program
{
static int Main(string[] args)
{
try
{
return AsyncContext.Run(() => MainAsync(args));
}
catch (Exception ex)
{
Console.Error.WriteLine(ex);
return -1;
}
}
static async Task<int> MainAsync(string[] args)
{
...
}
}
 
讨论
 
推荐使用async Task 而不是async void,原因之一就是返回Task 的方法更容易测试。至少要用Task 方法重载void 方法,那样可以提供便于测试的API 外壳。
 
如果你确实需要自己编写SynchronizationContext 类(例如AsyncContext),千万不要把这个SynchronizationContext 类放到不属于你的线程上。作为通用的准则,不要在已经有SynchronizationContext 的线程上(比如UI 或ASP.NET request 线程)安装这个类,也不要在线程池线程上放SynchronizationContext。属于你的线程有控制台程序的主线程,还有你自己创建的所有线程。
 
AsyncContext 类在NuGet 包Nito.AsyncEx 中。
 
参阅
 
2.8 节介绍async Task 方法的异常处理。
 
6.3 节介绍async void 方法的单元测试。
点击复制链接 与好友分享!回本站首页
分享到: 更多
您对本文章有什么意见或着疑问吗?请到论坛讨论您的关注和建议是我们前行的参考和动力  
上一篇:1.3 功能
下一篇:1.5 小结
相关文章
图文推荐
JavaScript网页动画设
1.9 响应式
1.8 登陆页式
1.7 主题式
排行
热门
文章
下载
读书

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训
版权所有: 红黑联盟--致力于做最好的IT技术学习网站