【发布时间】:2017-07-24 08:44:04
【问题描述】:
我有一个由特殊工厂创建的对象树的情况。这有点类似于 DI 容器,但不完全一样。
对象的创建总是通过构造函数发生,并且对象是不可变的。
在给定的执行中可能不需要对象树的某些部分,应该延迟创建。所以构造函数参数应该只是一个按需创建的工厂。这看起来像是 Lazy 的工作。
但是,对象创建可能需要访问慢速资源,因此始终是异步的。 (对象工厂的创建函数返回一个Task。)这意味着Lazy 的创建函数需要是异步的,因此注入的类型需要是Lazy<Task<Foo>>。
但我宁愿没有双层包装。我想知道是否可以强制 Task 变得懒惰,即创建一个保证在等待之前不会执行的 Task。据我了解,Task.Run 或 Task.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;}
}
【问题讨论】:
-
@DavidG 谢谢,我以前读过这篇文章。如果我不能让一个普通的
Task变得懒惰,这将是我会使用的解决方法,但我仍然希望有一种方法可以做到这一点。 -
如果任务尚未启动,Await 将不会为您启动任务,因此您不能“创建一个保证在等待之前不会执行的任务”(除非您在 await 发生之前的某个时候自己启动它)。
-
我自己不介意
Lazy<Task<T>>,但我的AsyncLazy<T>type 有一个方便的AsyncEx library。
标签: c# .net asynchronous .net-core