如何防止异步方法可重入?

Fra*_*osa 2 .net c# async-await uwp

我的程序中有一个异步方法。我需要该任务是异步的,因为它会发出网络请求,但我不希望它是可重入的。换句话说,如果在第一次调用返回之前从代码块 A 调用该方法,然后再次从代码块 B 调用,我希望第二次调用等到第一次调用完成后再运行。

如果该方法不是异步方法,我可以使用以下注释来完成它:[MethodImpl(MethodImplOptions.Synchronized)]

但是,编译器不允许将注释附加到异步方法。

我还可以做些什么?

can*_*on7 7

您可以使用 a SemaphoreSlim,这是一个带有WaitAsync方法的锁(并且不介意您在与获取它的线程不同的线程上释放它)。

private readonly SemaphoreSlim methodLock = new SemaphoreSlim(1, 1);

public async Task SomeMethod()
{
    await methodLock.WaitAsync();
    try
    {
        ...
    }
    finally
    {
        methodLock.Release();
    }
}
Run Code Online (Sandbox Code Playgroud)

如果你喜欢冒险,你可以在 上写一个扩展方法SemaphoreSlim,让你做例如:

public async Task SomeMethod()
{
    using (await methodLock.WaitDisposableAsync())
    {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

不过要小心:SemaphoreSlim不是递归的(也不可以)。这意味着如果您的方法是递归的,它将死锁。