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
函数。这只是一个可能在数据库中需要一段时间的函数,所以我试图确保它不会阻塞。我认为 await
在 async
网络 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
.
很抱歉听起来很啰嗦,但我发誓我已经阅读了 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
函数。这只是一个可能在数据库中需要一段时间的函数,所以我试图确保它不会阻塞。我认为 await
在 async
网络 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
.