来自同步方法的异步调用

时间:2014-02-10 21:19:00

标签: c# caching asynchronous async-await

我有一个异步缓存,假设是以异步方式阻塞线程,使用相同的缓存键进入“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;问题

0 个答案:

没有答案