那麼,不幸的是,你不能將對象構造拆分成協同例程。因此,不能在構造函數上使用async
。
您可以考慮使用工廠模式公開包裝器API。
using (var syncLock = await OperationSyncLockWrapperFactory.GetInstanceAsync(_syncLock))
{
await SomeAsyncOperation(parameter1);
}
您可以await
在工廠方法:
public static class OperationSyncLockWrapperFactory {
public static async Task<OperationSyncLockWrapper> GetInstaceAsync(YourSyncLockClass _syncLock)
{
OperationSyncLockWrapper syncLock = new OperationSyncLockWrapper(_syncLock);
await syncLock.Wait();
return syncLock;
}
}
編輯:感謝斯蒂芬的意見。同意使用擴展方法,使用API會更清晰。根據您的建議,這將是這樣的:
using (var syncLock = await _syncLock.GetSyncLockWrapperInstanceAsync())
{
await SomeAsyncOperation(parameter1);
}
和擴展類:
public static class YourSyncLockClassExtensions {
public static async Task<OperationSyncLockWrapper> GetSyncLockWrapperInstanceAsync
(this YourSyncLockClass _syncLock)
{
OperationSyncLockWrapper syncLock = new OperationSyncLockWrapper(_syncLock);
await syncLock.Wait();
return syncLock;
}
}
編輯2:當你暴露一個異步API給其他開發者資料庫,一般,當你在圖書館裏面await
時,你不想捕獲SynchronizationContext
- 這也是最佳做法。在你的情況下,現在你在工廠的方法await
,你會想要考慮不捕獲SynchronizationContext
。
在工廠方法:
await syncLock.Wait().ConfigureAwait(false);
來源
2013-07-14 09:14:59
YK1
這將是更清潔,如果工廠方法是用於'_syncLock'類型的擴展方法。 –
@StephenCleary:謝謝。根據您的建議 – YK1
更新答案,感謝您奉獻時間,這是一個很好的解決方法 – ilansch