当我使用 ToListAsync 方法时线程不起作用

V.W*_*.Wu 3 c# async-await .net-core ef-core-3.1

我有一个EF Core程序。

代码

class EagerLoading
{
    public async void load()
    {
        Console.WriteLine("a");
        var teams = await loadTeamsAsync();
        Console.WriteLine("c");
    }
    public async Task<List<Team>> loadTeamsAsync()
    {
        Console.WriteLine("b");
        using (var context = new SchoolContext())
        {
            return await context.teams.
                ToListAsync();
        }
    }
}
//Entry method
static void Main(string[] args)
{
    new EagerLoading().load();
}
Run Code Online (Sandbox Code Playgroud)

输出

a
b

Run Code Online (Sandbox Code Playgroud)

预期的

a
b
c
Run Code Online (Sandbox Code Playgroud)

我错在哪里?为什么Console.WriteLine("c");不执行?

AAA*_*ddd 5

您需要ReadKeyMain方法中放置 a或类似内容以阻止应用程序退出

Load是一个async void(应该敲响警钟)并且在未观察到的情况下运行,反过来应用程序很有可能在它以您期望的方式完成之前退出(或者在这种情况下写入控制台)。

static void Main(string[] args)
{
    new EagerLoading().load();
    Console.ReadKey();
}
Run Code Online (Sandbox Code Playgroud)

注意:您应该只在事件处理程序(或逻辑上表示事件处理程序的构造)上使用异步 void,这或多或少是它们存在的主要原因

  • 我想强调的是,这只是创可贴。正确的解决方案是让 load 方法返回一个 Task,让 Main 方法也返回 async Task 并等待 load 方法,最后删除不必要的 ReadKey。 (2认同)