gpt4 book ai didi

c# - 强制 C# 异步任务懒惰?

转载 作者:IT王子 更新时间:2023-10-29 04:49:08 25 4
gpt4 key购买 nike

我有一种情况,我有一个由特殊工厂创建的对象树。这有点类似于 DI 容器,但又不完全是。

对象的创建总是通过构造函数发生,并且对象是不可变的。

在给定的执行中可能不需要对象树的某些部分,应该延迟创建。所以构造函数参数应该只是按需创建的工厂。这看起来像是 Lazy 的工作.

但是,对象创建可能需要访问慢速资源,因此始终是异步的。 (对象工厂的创建函数返回一个 Task。)这意味着 Lazy 的创建函数。需要是异步的,因此注入(inject)的类型需要是 Lazy<Task<Foo>> .

但我宁愿不要双重包装。我想知道是否可以强制 Task懒惰,即创建一个 Task保证在等待之前不会执行。据我了解,Task.RunTask.Factory.StartNew可以随时开始执行(例如,如果池中的线程空闲),即使没有任何东西在等待它。

public class SomePart
{
// Factory should create OtherPart immediately, but SlowPart
// creation should not run until and unless someone actually
// awaits the task.
public SomePart(OtherPart eagerPart, Task<SlowPart> lazyPart)
{
EagerPart = eagerPart;
LazyPart = lazyPart;
}

public OtherPart EagerPart {get;}
public Task<SlowPart> LazyPart {get;}
}

最佳答案

我不确定你为什么要避免使用 Lazy<Task<>>, , 但如果只是为了使 API 更易于使用,因为这是一个属性,您可以使用支持字段来实现:

public class SomePart
{
private readonly Lazy<Task<SlowPart>> _lazyPart;

public SomePart(OtherPart eagerPart, Func<Task<SlowPart>> lazyPartFactory)
{
_lazyPart = new Lazy<Task<SlowPart>>(lazyPartFactory);
EagerPart = eagerPart;
}

OtherPart EagerPart { get; }
Task<SlowPart> LazyPart => _lazyPart.Value;
}

这样,使用就好像它只是一个任务,但初始化是惰性的,只会在需要时才进行工作。

关于c# - 强制 C# 异步任务懒惰?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45275967/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com