异步调用中处理异常的最佳实践

4
例如,我正在使用wenclient.DownloadfileAsync异步下载文件。
在DownloadFileCompleted事件处理程序中,我可以使用AsyncCompletedEventArgs.Error属性检查是否有任何异常。
如果我重新抛出此异常,但我的可执行文件会立即停止运行。
我想知道如何处理这种类型的异常?如何将此异常传递回调用线程?
1个回答

2
最好的方式是使用C# 5的异步支持 :)
但是你可以通过相同的方式将异常传递回调用线程,就像传递结果一样。如果您正在使用.NET 4,可以使用Task<T>来允许原始线程访问成功的结果或异常。实际上,如果他们尝试访问成功的结果并且存在故障,异常会自动抛出(包装在AggregateException中)。调用方也可以显式地检查失败。
如果您不使用.NET 4,当然可以自己模拟所有这些,编写具有适当属性的自己的类型。

我正在使用C# 3,你能分享任何具体的例子来将结果和异常传递回调用线程吗? - user496949
等一下,有C# 5?我以为我们还在4呢? - Bobby
@Bobby:我们现在使用的是4版,但5版的主要功能已经在PDC上公布了。 - Jon Skeet
@user496949:那你目前是如何返回结果的呢?看一下 Task<T> 类型的 API,复制你需要的想法。 - Jon Skeet
@Jon Skeet:哦,现在我知道为什么“will”是斜体了。好知道,谢谢。 - Bobby
我正在传递一个自定义对象来存储异常,并且它可以正常工作。 - user496949

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接