gpt4 book ai didi

c# - List 不包含 GetAwaiter 的定义

转载 作者:太空狗 更新时间:2023-10-29 17:28:32 46 4
gpt4 key购买 nike

我有一个返回对象列表<>的方法。此方法需要一段时间才能运行。

private List<MyObject> GetBigList()
{
... slow stuff
}

此方法从 4 或 5 个来源调用。所以,我想我会尝试使用 async 和 await 来让这个列表构建时保持移动。我添加了这个方法:

public async Task<List<MyObject>> GetBigListAsync()
{
var resultsTask = GetBigList();
var resuls = await resultsTask;
return resuls;
}

但是,在这条线上:

var resuls = await resultsTask;

我收到这个错误:

List<MyObject> does not contain a definition for GetAwaiter, and no extension method 'GetAwaiter' accepting a first argument of type List<MyObject> could be found.

我错过了什么?

最佳答案

看来您是异步等待的新手。真正帮助我理解 async-await 作用的是 Eric Lippert 在 this interview. 中给出的餐厅类比。在中间某处搜索异步等待。

他在这里描述说,如果厨师必须等待某事,他不会什么都不做,而是开始环顾四周,看看是否可以同时做其他事情。

Async-await 类似。不是等待读取文件、返回数据库查询、下载网页,您的线程将进入调用堆栈以查看是否有任何调用者没有等待并执行这些语句,直到他看到等待。一旦他看到 await,线程就会再次上升到调用堆栈,以查看是否有一个调用者没有在等待等。一段时间后,当文件被读取,或者查询完成等时,等待之后的语句被执行。

通常,在阅读您的大列表时,您的线程会非常繁忙,而不是无所事事地等待。不确定命令另一个线程来做这些事情会减少阅读列表所需的时间。考虑测量这两种方法。

One reason to use async-await, even if it would lengthen the time needed to read the big list, would be to keep the caller (user interface?) responsive.

要使您的函数异步,您应该执行以下操作:

  • 声明异步函数;
  • 代替TResult返回 Task<TResult>而不是 void返回 Task ;
  • 如果您的函数调用其他异步函数,请考虑记住返回的任务而不是 await ,做你需要做的其他有用的事情和await需要结果时的任务;
  • 如果您真的想让另一个线程处理繁忙的事情。调用

    Task.Run( () => GetBigList())

并在需要结果时等待。

private async Task<List<MyObject>> GetBigListAsync()
{
var myTask = Task.Run( () => GetBigList());
// your thread is free to do other useful stuff right nw
DoOtherUsefulStuff();
// after a while you need the result, await for myTask:
List<MyObject> result = await myTask;

// you can now use the results of loading:
ProcessResult(result);
return result;
}

再说一次:如果在另一个线程正在加载列表时您无事可做(例如保持 UI 响应),请不要这样做,或者至少衡量一下您是否更快。

其他帮助我理解 async-await 的文章是 - Async await , 由非常乐于助人的 Stephen Cleary 提供, - 更高级一点:Async-Wait best practices .

关于c# - List<MyObject> 不包含 GetAwaiter 的定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40774931/

46 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com