[英]Exception handling in fire and forget for C# 5 (in .net 4.5)
考虑以下“即发即弃”用例:
调用者从我的方法请求一些数据。 我的方法检查缓存以查看数据是否已存在。 如果不是,则从源获取并缓存它。 在获得结果之前,调用者不需要等待缓存发生,并且如果缓存失败,该方法不应该阻止调用者获得结果。 我今天拥有的,看起来像这样:
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中)它被框架吞没了。 我宁愿自己最后一次清理异常,但我不想阻止当前的线程。 最好的方法是什么?
这是我尝试过的
try
{
...
cacheTask.ContinueWith
(
(e) => {
if (cacheTask.IsFaulted)
{
/* log cacheTask.Exception */;
}
}
, TaskContinuationOptions.OnlyOnFaulted
);
}
有没有更好的办法? 我是否需要IsFaulted上的“if”语句或者这是多余的,因为我已经指定了“OnlyOnFaulted”?
任何意见/建议将不胜感激。
四件事:
cacheTask
; 你的回调中的e
是同一个任务,所以你也可以改用它。 (然后相同的代理可以用于所有任务。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.