C# 任务==懒惰吗? 公共数据GetCurrent(凭据) { var data=newlazy(()=>GetCurrentInternal(凭证)); 尝试 { 返回数据值; } 捕获(无效操作异常ex) { 抛出ex.InnerException; } }
如果我将呼叫更改为以下内容:C# 任务==懒惰吗? 公共数据GetCurrent(凭据) { var data=newlazy(()=>GetCurrentInternal(凭证)); 尝试 { 返回数据值; } 捕获(无效操作异常ex) { 抛出ex.InnerException; } },c#,.net,C#,.net,如果我将呼叫更改为以下内容: public Data GetCurrent(Credentials credentials) { var data = new Lazy<Data>(() => GetCurrentInternal(credentials)); try { return data.Value; } catch (InvalidOperationException ex) { thr
public Data GetCurrent(Credentials credentials)
{
var data = new Lazy<Data>(() => GetCurrentInternal(credentials));
try
{
return data.Value;
}
catch (InvalidOperationException ex)
{
throw ex.InnerException;
}
}
var data=新任务(()=>GetCurrentInternal(凭证));
有什么变化吗?我应该更喜欢
任务
而不是懒惰
?那么Dispose()
和catch(Exception)
呢?任务
和惰性
是完全不同的概念
您可以使用任务执行异步操作。一些无聊的MSDN:
Task类表示不返回任务的单个操作
值,该值通常异步执行。任务对象就是其中之一
首先是基于任务的异步模式的核心组件
在.NETFramework 4中引入。因为工作是由一个
任务对象通常在线程池线程上异步执行
您可以使用
Status属性以及IsCanceled、IsCompleted和IsCompleted属性
IsFaulted属性,用于确定任务的状态。最常见的是,
lambda表达式用于指定任务要执行的工作
表演
Lazy用于对象的延迟初始化。这意味着,只有在调用lazyObj.Value
时,对象才会初始化
使用延迟初始化延迟创建大型或大型
资源密集型对象,或执行资源密集型
任务,特别是在可能不会发生此类创建或执行时
在程序的生命周期内
为了准备惰性初始化,您需要创建一个惰性的实例。
创建的惰性对象的类型参数指定
要延迟初始化的对象的类型。构造器
用于创建惰性对象的属性决定了
初始化的特征。延迟初始化发生在
首次访问Lazy.Value属性时
Task
和Lazy
是完全不同的概念
您可以使用任务执行异步操作。一些无聊的MSDN:
Task类表示不返回任务的单个操作
值,该值通常异步执行。任务对象就是其中之一
首先是基于任务的异步模式的核心组件
在.NETFramework 4中引入。因为工作是由一个
任务对象通常在线程池线程上异步执行
您可以使用
Status属性以及IsCanceled、IsCompleted和IsCompleted属性
IsFaulted属性,用于确定任务的状态。最常见的是,
lambda表达式用于指定任务要执行的工作
表演
Lazy用于对象的延迟初始化。这意味着,只有在调用lazyObj.Value
时,对象才会初始化
使用延迟初始化延迟创建大型或大型
资源密集型对象,或执行资源密集型
任务,特别是在可能不会发生此类创建或执行时
在程序的生命周期内
为了准备惰性初始化,您需要创建一个惰性的实例。
创建的惰性对象的类型参数指定
要延迟初始化的对象的类型。构造器
用于创建惰性对象的属性决定了
初始化的特征。延迟初始化发生在
首次访问Lazy.Value属性时
相似之处
Lazy
和Task
都承诺稍后做一些工作,并返回类型为T
的结果
分歧
Lazy
承诺,如果需要的话,它会尽可能晚地完成工作,并同步完成
任务
但是可以在线程执行其他工作或块等待结果时异步执行其工作
Lazy
将在调用.Value
时引发lambda引起的任何异常
Task
将保留lambda引起的任何异常,并在您等待Task时稍后抛出该异常。或者如果您task.Wait()
它可能会将异常包装在AggregationException
中。有关捕获任务引发的异常的更多信息,请参阅本文:这与
Lazy
和Task
都承诺稍后做一些工作,并返回类型为T
的结果
分歧
Lazy
承诺,如果需要的话,它会尽可能晚地完成工作,并同步完成
任务
但是可以在线程执行其他工作或块等待结果时异步执行其工作
Lazy
将在调用.Value
时引发lambda引起的任何异常
Task
将保留lambda引起的任何异常,并在您等待Task时稍后抛出该异常。或者如果您task.Wait()
它可能会将异常包装在AggregationException
中。有关捕获任务引发的异常的更多信息,请参阅本文:这与Task
不同
是对以下概念的实施:
T
值,该值将在第一次访问时同步计算,可能发生,也可能根本不发生与一个概念有关
var data = new Task<Data>(() => GetCurrentInternal(credentials));