async/await "List<> does not contain a definition for 'GetAwaiter'"

async/await "List<> does not contain a definition for 'GetAwaiter'"

很抱歉听起来很啰嗦,但我发誓我已经阅读了 async/await 并尝试了示例,但我仍然对一些简单的事情感到困惑,例如为什么以下代码会给我错误:

        [HttpGet("{includeInactive}")]
        public async Task<List<Torrent>> GetTorrentsAll(bool includeInactive)
        {
            List<Torrent> torrentsAll = await _cacheStore.GetCachedTorrentsAll();

            //...potentially filter torrentsAll here

            return torrentsAll;
        }

所以 _cacheStore.GetCachedTorrentsAll() 不是 async 函数。这只是一个可能在数据库中需要一段时间的函数,所以我试图确保它不会阻塞。我认为 awaitasync 网络 API 中使用它是解决此问题的方法。但是我在 await _cacheStore.GetCachedTorrentsAll() 行下遇到令人困惑的错误,上面写着 'List does not contain a definition for 'GetAwaiter' and no accessible extension method 'GetAwaiter' accepting a first argument of type 'List' 可以找到(您是否缺少 using 指令或程序集引用?).

我对此很困惑。

您可以将代码重写为如下所示:

[HttpGet("{includeInactive}")]
public async Task<List<Torrent>> GetTorrentsAll(bool includeInactive, CancellationToken token)
{
    return await Task.Run(() => {
        List<Torrent> torrentsAll = _cacheStore.GetCachedTorrentsAll();

    
    return torrentsAll;
    }, token);
}

So _cacheStore.GetCachedTorrentsAll() is not an async function. It's just a function that potentially might be taking a while in the database, so I was trying to ensure that it's not blocking.

那么做成异步也是合理的。

I guess maybe since _cacheStore.GetCachedTorrentsAll() is not async, it will still block the thread regardless (?)

这是正确的。同步方法 - 根据定义 - 阻塞调用线程直到它们完成。

In which case async/await seems like a rabbit hole to me,

可以。在这种情况下,您已经正确识别了一个应该是异步的操作(即 I/O-bound)。但是仅仅在控制器方法上粘贴 async 并没有帮助;这实际上是实现异步的最后 步。

第一步是确定 lowest-level API 应该 是异步的。例如,数据库查询。使 that 调用首先使用异步数据库 API,然后使用 await,然后使该方法 async。然后让 async/await 通过您的应用从该方法中成长。它最终会在控制器方法中结束,然后你就可以做到 async.