我有一个异步缓存,假设是以异步方式阻塞线程,使用相同的缓存键进入“AsyncLock”(正在更新该密钥)。我想知道,如果异步方法的调用者不是异步,那么其他线程是否异步或同步请求相同的缓存键块?换句话说,在等待结果的同时,等待线程是否会返回到线程池,否则它们将被无用地阻塞,直到返回结果并且AsyncLock / key打开?
以下是一些代码片段,显示了我的问题的所有背景信息。如果您需要更多代码,请参阅此处https://github.com/stewie1570/Cache以获取完整的&非常小的公共GitHub回购。
这是调用异步代码的synchronouse方法:
public T Get(string key, Func<T> func, int entryLifeTimeInSeconds = 60)
{
T ret = null;
_lock.Run(key, () => ret = PerformNonThreadSafeCache(key, func, entryLifeTimeInSeconds));
return ret;
}
以下是它所说的:
public async void Run(string key, Action action)
{
using (var releaser = await _locks.GetOrAdd(key, s => new AsyncLock()).LockAsync())
{
action();
}
}
这是AsyncLock.LockAsync()
public Task<IDisposable> LockAsync()
{
var wait = _semaphore.WaitAsync();
return wait.IsCompleted ? _releaser :
wait.ContinueWith((t, o) => (IDisposable)o,
_releaser.Result,
CancellationToken.None,
TaskContinuationOptions.ExecuteSynchronously,
TaskScheduler.Default);
}
我读过的所有其他线程和文章都显示了类似的情况(但是我不能告诉我这是否正确)或基本上整个调用堆栈是异步的情况我对这个问题&amp;问题