首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C# 5(在.net 4.5中)的触发和遗忘中的异常处理

C# 5(在.net 4.5中)的触发和遗忘中的异常处理
EN

Stack Overflow用户
提问于 2013-04-11 23:59:35
回答 1查看 4.1K关注 0票数 8

考虑下面的“即发即忘”用例:

调用者从我的方法中请求一些数据。我的方法检查缓存,看看数据是否已经存在。如果不是,它会从源中获取并缓存。调用者不应该在获得结果之前等待缓存发生,并且如果缓存碰巧失败,该方法也不应该阻止调用者获得结果。我今天所拥有的,看起来像这样:

代码语言:javascript
复制
public Foo GetFoo(string fooKey)
{
    // look for Foo with fooKey in cache
    // if Foo is not found, get Foo with fooKey from source
    // and assign it to local variable myFoo
    Task cacheTask 
           = Task.Run
                (
                    () => CacheFoo(myFoo)// fire-and-forget the caching of myFoo
                ); 
    return myFoo;
}

如果CacheFoo抛出一个异常,它就不会被观察到,最终(在.Net 4.5中)它会被框架吞没。我宁愿自己做最后一次清理异常的尝试,但我不想阻塞当前的线程。那么最好的方法是什么呢?

以下是我尝试过的方法

代码语言:javascript
复制
try
{
    ...
   cacheTask.ContinueWith
            (
                (e) => { 
                         if (cacheTask.IsFaulted) 
                            { 
                             /* log cacheTask.Exception */; 
                             } 
                        }
                , TaskContinuationOptions.OnlyOnFaulted
            ); 
}

有没有更好的方法?我是否需要在IsFaulted上使用"if“语句,还是因为我已经指定了"OnlyOnFaulted”而显得多余?

如有任何意见/建议,我们将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-04-12 00:05:50

四件事:

  • 不,你不需要Task.IsFaulted property;回调只会在它出错的情况下触发,你不需要捕获cacheTask;回调中的e也是同样的任务,所以你最好改用它。(然后可以对所有任务使用相同的委托。)
  • 如果您总是以相同的方式登录,您可能希望在任务上编写一个扩展方法来简化此操作
  • 作为添加处理程序的替代方法,您可以考虑订阅TaskScheduler.UnobservedTaskException并在其中执行日志记录
票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15953520

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档