0

我创建了一个锁定对象包装器(类),它使用 semaphoreSlim(1) 作为我的管理器(类)操作的锁定机制。
我的管理器类包含一个我在构建新包装器类时发送的锁,然后我在这个包装器类锁上使用 Await(实际上等待我在构建时发送它的锁)。并在 Dispose 时释放(包装类的目的是自动锁定和释放,构造时锁定,dispose 时释放)。

我将此模式用于我构建的新锁包装器:

//_syncLock is a class that used as member lock to use in my operations as async lock.
using (OperationSyncLockWrapper syncLock = new OperationSyncLockWrapper(_syncLock))
{
    await syncLock.Wait(); //I wish to avoid this line and run it automatically
    await SomeAsyncOperation(parameter1);
}  

因为我不能在构造方法中使用 async/await。是否有另一种方法可以等待我刚刚创建的新对象 - 在类构造或之后?

4

2 回答 2

6

好吧,不幸的是,您不能将对象构造拆分为协同例程。因此,不能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);
于 2013-07-14T09:14:59.410 回答
0

目前唯一的方法await是在方法声明上实际使用该关键字和async修饰符,将您的方法转换为协同例程。

如果没有这些关键字来产生它们提供的相同行为,您就无法模拟协同例程创建。

于 2013-07-14T08:25:21.967 回答