使用ToListAsync方法时,线程无法正常工作。

3

我有一个 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();
}

输出

a
b

预期结果

a
b
c

问题

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


如果在 context.teams.ToListAsync() 调用之后放置一个 Console.WriteLine,它会被调用吗?据我所知,您的请求仍未返回。 - JReno
1
load 是一个异步的 void 方法。由于你的例子,不建议使用异步 void 方法。你有一个同步的主方法,你正在调用一个异步 void 方法,但在幕后有一个异步操作,在主方法完成后才会完成。 - Amir Popovich
1
你的代码需要在Main方法中使用ReadKey()。 - Amankhani MohammadJavad
1
避免使用 async void。 - Theodor Zoulias
1个回答

5

你需要在Main方法中放置一个ReadKey或类似的东西,以防止应用程序退出

Load是一个async void(这应该引起警惕),并且以未被观察的方式运行,因此很有可能在你期望的方式完成之前(或在本例中写入console之前)应用程序退出

static void Main(string[] args)
{
    new EagerLoading().load();
    Console.ReadKey();
}
<注意>:您只应该在事件处理程序(或逻辑上表示事件处理程序的结构)中使用异步 void,这几乎是它们存在的主要原因。

2
我想强调这只是一个权宜之计。正确的解决方案应该是使load方法返回一个Task,使Main方法也返回async Task并等待load方法,最后删除不必要的ReadKey。 - ckuri

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