public Data GetCurrent(Credentials credentials)
{
var data = new Lazy<Data>(() => GetCurrentInternal(credentials));
try
{
return data.Value;
}
catch (InvalidOperationException ex)
{
throw ex.InnerException;
}
}
如果我将调用更改为以下内容:
var data = new Task<Data>(() => GetCurrentInternal(credentials));
有什么变化吗?我应该更喜欢Task
over Lazy
?关于什么Dispose()
and catch(Exception)
?
相似之处
Both Lazy<T>
and Task<T>
承诺稍后做一些工作并返回类型的结果T
.
差异
Lazy<T>
承诺在需要时尽可能晚地完成工作,并且同步完成。
Task<T>
但是,当您的线程执行其他工作或阻塞等待结果时,可以异步执行其工作。
Lazy<T>
当您调用时,将冒出由 lambda 引起的任何异常.Value
.
Task<T>
将保留由 lambda 引起的任何异常,并在稍后抛出它await task
。或者如果你task.Wait()
it may将异常包装在AggregationException
。我建议您参阅此内容以获取有关捕获任务引发的异常的更多信息:捕获异步方法抛出的异常和这个http://stiller.co.il/blog/2012/12/task-wait-vs-await/
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)