【问题标题】:a thread doesn't work when I use ToListAsync method当我使用 ToListAsync 方法时线程不起作用
【发布时间】:2020-03-04 05:47:26
【问题描述】:

我有一个 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,它会被调用吗?据我所知,您的请求仍未被退回
  • load 是一个异步 void 方法。由于您的示例,不建议完全使用 async void 方法。您有一个同步主方法,您正在调用一个异步 void 方法,但在幕后有一个异步操作在主方法完成后完成。
  • 你的代码在 Main 方法中需要 ReadKey()

标签: c# .net-core async-await ef-core-3.1


【解决方案1】:

您需要在Main 方法中添加ReadKey 或类似名称,以阻止应用程序退出

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

static void Main(string[] args)
{
    new EagerLoading().load();
    Console.ReadKey();
}

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

【讨论】:

  • 我想强调的是,这只是一个创可贴。一个正确的解决方案是让load方法返回一个Task,让Main方法也返回async Task并等待load方法,最后去掉当时不需要的ReadKey。
猜你喜欢
  • 2018-08-04
  • 2013-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多