假設我有一個需要異步操作初始化的成員的類(例如文件I/O或Web請求)。我只需要初始化一次,而且我不想重新初始化。僅初始化異步模式
任務和異步 - 是否等待完成此任務?
這裏是目前我在做什麼的例子:
private Task _initializeTask;
public Task InitializeAsync()
{
return _initializeTask ?? (_initializeTask = Task.Run(
async() =>
{
// Do an action requiring await here
await _storageField.LoadAsync();
}));
}
這是否做什麼我想它呢?有沒有更好的方法來做到這一點?
線程安全嗎?不是一個要求,但應該考慮。
編輯:
我認爲它呢?我相信,如果_initializeTask尚未分配,那麼它將被分配一個新任務,它將啓動並等待包含在其中的異步lambda。對該方法的任何後續調用都將等待已分配給_initializedTask的已運行(或已完成)任務。
我什麼時候需要它來構造?通常我會在使用IoC容器解析的服務上使用這種方法。可以通過引用類來構造多個相關類。然後,在使用之前,它們中的每一個都在等待InitializeAsync()。如果是多個依賴類,那麼我不想在初始化它時加倍。
工廠方法?通常不會有多個需要初始化的實例構建,因此Factory方法似乎不是一個好的解決方案。我已經對文件夾包裝類使用了類似「靜態CreateAsync()」方法的東西,但是這並不允許我將初始化的文件夾註入到構造函數中。 Async Factory方法在無法與IoC構造函數注入一起使用時不會獲得任何收益。
你怎麼看它? – 2014-10-09 01:21:54
您希望'Lazy'適用於延遲加載行爲。或者在類的每個實例中通用的初始化代碼的靜態構造函數。 –
Aron
2014-10-09 01:27:38
你想要什麼時候開始初始化?在建設? – 2014-10-09 01:29:23