【问题标题】:does not contain a definition for 'GetAwaiter' and no accessible extension method 'GetAwaiter' accepting a first argument of type 'List不包含“GetAwaiter”的定义,并且没有可访问的扩展方法“GetAwaiter”接受“List”类型的第一个参数
【发布时间】:2020-06-12 12:27:43
【问题描述】:

我在此方法返回时遇到错误does not contain a definition for 'GetAwaiter' and no accessible extension method 'GetAwaiter' accepting a first argument of type 'List。我可以知道我错过了什么吗?

[HttpGet]
public async Task<ActionResult<IEnumerable<MovieDto>>> GetMovies()
{
    var movies = (from m in _context.Movies
                    select new MovieDto()
                    {
                        MovieTitle = m.MovieTitle,
                        ReleaseDate = m.ReleaseDate,
                        MovieStatus = m.MovieStatus,
                        PhotoFile = m.PhotoFile
                    }).ToList();

    return await movies;
}

【问题讨论】:

  • ToList 返回 List&lt;T&gt; 而不是 Task。你不能awaitList&lt;T&gt;
  • 好吧ToList() 不是异步的,它不返回任务。也许你想使用ToListAsync()

标签: c# asp.net-mvc


【解决方案1】:

ToList() 不是 async,它不会返回 Task。也许你想使用ToListAsync()

[HttpGet]
public async Task<ActionResult<IEnumerable<MovieDto>>> GetMovies()
{
    var movies = (from m in _context.Movies
                    select new MovieDto()
                    {
                        MovieTitle = m.MovieTitle,
                        ReleaseDate = m.ReleaseDate,
                        MovieStatus = m.MovieStatus,
                        PhotoFile = m.PhotoFile
                    }).ToListAsync();

    return Ok(await movies);
}

【讨论】:

  • 它有效。就我而言,不仅是 ToListAsync(),而且“return Ok(await movies)”语句也起到了至关重要的作用。
【解决方案2】:

您可以尝试异步运行 LINQ 查询来实现此目的

[HttpGet]
    public async Task<List<MovieDto>> GetMovies () {
        var moviesTask =
            Task.Factory.StartNew (() => {
                return (from m in _context.Movies 
                        select new MovieDto () {
                          MovieTitle = m.MovieTitle,
                          ReleaseDate = m.ReleaseDate,
                          MovieStatus = m.MovieStatus,
                          PhotoFile = m.PhotoFile
                }).ToList ();
            });
        var movies = await moviesTask;
        return movies;
    }

【讨论】:

  • ToListAsync 使用真正的异步会好得多,而不是用 IO 阻塞不同的线程。
猜你喜欢
  • 2020-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-15
  • 2023-03-13
  • 2019-07-29
  • 1970-01-01
相关资源
最近更新 更多