在单线程异步上,应该使用SemaphoreSlim
而不是lock
来进行锁定。SemaphoreSlim
是用于协调并发访问的类,它允许多个线程同时访问资源,但限制并发访问的数量。下面是一个示例代码:
private static readonly SemaphoreSlim _semaphore = new SemaphoreSlim(1);
public async Task GetValueAsync()
{
await _semaphore.WaitAsync();
try
{
// Do async work here
return 42;
}
finally
{
_semaphore.Release();
}
}
在此示例中,_semaphore
是一个只允许一个线程访问资源的信号量。WaitAsync
方法在可用信号量时立即返回,否则将挂起线程的执行。然后,在try
块中执行异步工作,并在最后使用Release
方法释放信号量。这样可以确保在任何时间只有一个线程在访问资源,避免了死锁和其他并发问题。