好吧,不幸的是,您不能将对象构造拆分为协同例程。因此,不能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;
}
}
编辑 2SynchronizationContext
:当您使用您的库向其他开发人员公开异步 API 时,通常,您不想await
在库中捕获 - 这也是最佳实践。在你的情况下,既然你await
在工厂方法中,你会想考虑不捕获SynchronizationContext
.
在工厂方法中:
await syncLock.Wait().ConfigureAwait(false);