gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 02:52:02 28 4
gpt4 key购买 nike

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

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

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

我还能做什么?

最佳答案

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

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

public async Task SomeMethod()
{
await methodLock.WaitAsync();
try
{
...
}
finally
{
methodLock.Release();
}
}

如果您喜欢冒险,可以在 SemaphoreSlim 上编写扩展方法,让您可以执行以下操作:

public async Task SomeMethod()
{
using (await methodLock.WaitDisposableAsync())
{
...
}
}

但要小心:SemaphoreSlim不是递归的(也不可能是)。这意味着如果你的方法是递归的,它就会死锁。

关于c# - 如何防止异步方法可重入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59863593/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com