不包含 'GetAwaiter' 的定义,也没有可访问的扩展方法接受类型为 'List' 的第一个参数。

9

在这个方法的返回处,我遇到了错误不包含名为“GetAwaiter”的定义,并且没有接受类型为 'List的第一个参数的可访问扩展方法“GetAwaiter”。请问我错过了什么?

[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;
}

3
ToList 返回一个 List<T> 而不是一个 Task。你不能使用 await 关键字等待一个 List<T> - JohanP
3
“ToList()”方法不是异步的,它不返回任务。也许你想使用“ToListAsync()”方法。 - Borka
3个回答

11

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);
}

1
它有效。在我的情况下,不仅是ToListAsync(),而且"return Ok(await movies)"语句也起了至关重要的作用。 - Siva Makani
用这个简短而精美的解决方案替换了几个类中的许多代码行。干得好,谢谢。 - Libertine Makinta

0

或者只需扩展一个名为GetAwaiter()的函数,如下所示,这是代码:

public static class ExtendClass{ public static TaskAwaiter GetAwaiter(this AsyncOperation asyncOp) { var tcs = new TaskCompletionSource(); asyncOp.completed += obj => { tcs.SetResult(null); }; return ((Task)tcs.Task).GetAwaiter(); } }

请注意,该类必须是静态的。您可以将此代码复制并粘贴到新类中。


0
你可以尝试异步运行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;
    }

2
最好使用ToListAsync的真正异步方式,而不是通过IO阻塞不同的线程。 - juharr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接