不,Lazy
不一样Task
.
Lazy
是懒惰评估概念的实现:
它表示T
将在第一次访问时同步计算的值,该值可能会也可能根本不会发生.
评估在首次访问时发生,后续访问使用缓存值.记忆是一个密切相关的概念.
第一次访问将阻塞以计算值,而后续访问将立即生成值.
Task
与未来的概念有关.
它表示在创建其承诺时T
将计算(通常是异步)的值,即使没有人最终实际访问它.
所有访问都会产生一个缓存值,该缓存值已经或将要在之前或将来的时间由评估机制(承诺)计算.
在计算值完成之前发生的任何访问都将阻塞,直到计算完成.在计算值完成后发生的任何访问将立即产生计算值.
所有这一切,Lazy
并Task
确实有一些你可能已经接受的共同点.
这些类型中的每一种都是一元泛型类型,它描述了执行特定计算的唯一方法,该方法将产生一个T
值(并且该计算可以方便地作为委托或lambda传递).换句话说,这些类型中的每一个都是monad的示例.您可以在Stack Overflow和其他地方找到一些非常好的简单解释monad的内容.
双方Lazy
并Task
承诺以后做了一些工作,并返回类型的结果T
.
Lazy
承诺如果需要的话尽可能晚地完成工作,并且同步进行.
Task
但是,当您的线程执行其他工作或阻止等待结果时,可以异步执行其工作.
Lazy
当你打电话时,会冒出lambda引起的任何异常.Value
.
Task
将保留lambda引起的任何异常,并在以后抛出它await task
.或者,如果你task.Wait()
也可以在包装该异常AggregationException
.关于捕获任务引发的异常的更多信息,我向您推荐这个:捕获异步方法引发的异常,并查看此http://stiller.co.il/blog/2012/12/task-wait-vs-await/
不,Lazy
不一样Task
.
Lazy
是懒惰评估概念的实现:
它表示T
将在第一次访问时同步计算的值,该值可能会也可能根本不会发生.
评估在首次访问时发生,后续访问使用缓存值.记忆是一个密切相关的概念.
第一次访问将阻塞以计算值,而后续访问将立即生成值.
Task
与未来的概念有关.
它表示在创建其承诺时T
将计算(通常是异步)的值,即使没有人最终实际访问它.
所有访问都会产生一个缓存值,该缓存值已经或将要在之前或将来的时间由评估机制(承诺)计算.
在计算值完成之前发生的任何访问都将阻塞,直到计算完成.在计算值完成后发生的任何访问将立即产生计算值.
所有这一切,Lazy
并Task
确实有一些你可能已经接受的共同点.
这些类型中的每一种都是一元泛型类型,它描述了执行特定计算的唯一方法,该方法将产生一个T
值(并且该计算可以方便地作为委托或lambda传递).换句话说,这些类型中的每一个都是monad的示例.您可以在Stack Overflow和其他地方找到一些非常好的简单解释monad的内容.