public Data GetCurrent(Credentials credentials)
{
var data = new Lazy<Data>(() => GetCurrentInternal(credentials));
try
{
return data.Value;
}
catch (InvalidOperationException ex)
{
throw ex.InnerException;
}
}
Run Code Online (Sandbox Code Playgroud)
如果我将呼叫更改为以下内容:
var data = new Task<Data>(() => GetCurrentInternal(credentials));
Run Code Online (Sandbox Code Playgroud)
有什么变化吗?我宁愿Task过Lazy?怎么样Dispose()和catch(Exception)?
wes*_*ton 11
双方Lazy<T>并Task<T>承诺以后做了一些工作,并返回类型的结果T.
Lazy<T> 承诺如果需要的话尽可能晚地完成工作,并且同步进行.
Task<T> 但是,当您的线程执行其他工作或阻止等待结果时,可以异步执行其工作.
Lazy<T>当你打电话时,会冒出lambda引起的任何异常.Value.
Task<T>将保留lambda引起的任何异常,并在以后抛出它await task.或者,如果你task.Wait()也可以在包装该异常AggregationException.关于捕获任务引发的异常的更多信息,我向您推荐这个:捕获异步方法引发的异常,并查看此http://stiller.co.il/blog/2012/12/task-wait-vs-await/
The*_*kis 11
不,Lazy<T>不一样Task<T>.
T将在第一次访问时同步计算的值,该值可能会也可能根本不会发生.T将计算(通常是异步)的值,即使没有人最终实际访问它.所有这一切,Lazy<T>并Task<T>确实有一些你可能已经接受的共同点.
这些类型中的每一种都是一元泛型类型,它描述了执行特定计算的唯一方法,该方法将产生一个T值(并且该计算可以方便地作为委托或lambda传递).换句话说,这些类型中的每一个都是monad的示例.您可以在Stack Overflow和其他地方找到一些非常好的简单解释monad的内容.
| 归档时间: |
|
| 查看次数: |
1443 次 |
| 最近记录: |