Fra*_*osa 2 .net c# async-await uwp
我的程序中有一个异步方法。我需要该任务是异步的,因为它会发出网络请求,但我不希望它是可重入的。换句话说,如果在第一次调用返回之前从代码块 A 调用该方法,然后再次从代码块 B 调用,我希望第二次调用等到第一次调用完成后再运行。
如果该方法不是异步方法,我可以使用以下注释来完成它:[MethodImpl(MethodImplOptions.Synchronized)]
但是,编译器不允许将注释附加到异步方法。
我还可以做些什么?
您可以使用 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是不是递归的(也不可以)。这意味着如果您的方法是递归的,它将死锁。