Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 任务==懒惰吗? 公共数据GetCurrent(凭据) { var data=newlazy(()=>GetCurrentInternal(凭证)); 尝试 { 返回数据值; } 捕获(无效操作异常ex) { 抛出ex.InnerException; } }_C#_.net - Fatal编程技术网

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
    值,该值将在第一次访问时同步计算可能发生,也可能根本不发生
  • 计算发生在第一次访问时,后续访问使用缓存值。是一个密切相关的概念
  • 第一次访问将阻塞以计算值,而后续访问将立即生成值

  • 与一个概念有关

  • It r
    var data = new Task<Data>(() => GetCurrentInternal(credentials));