我有一種情況,我有一個由特殊工廠創建的對象樹。這有點類似於DI容器,但不完全。強制C#異步任務是懶惰?
創建對象總是通過構造函數發生,而對象是不可變的。
對象樹的某些部分在給定的執行過程中可能不需要,應該延遲創建。所以構造參數應該是按需創建的工廠。這看起來像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;}
}
這有用嗎? https://blogs.msdn.microsoft.com/pfxteam/2011/01/15/asynclazyt/ – DavidG
@DavidG謝謝,我以前閱讀過這篇文章。如果我不能做一個普通的'Task'懶惰,這將是我將使用的解決方法,但我仍然希望有一種方法來做到這一點。 –
如果它尚未啓動,Await將不會爲您啓動任務,因此您無法「創建一個保證不會執行的任務,直到等待完成」(除非您在等待之前自行啓動)。 – Evk