实体框架的异步功能无法正常运行

时间:2020-05-22 09:31:40

标签: c# entity-framework

据我所知,异步函数会立即返回。下面的示例代码确认了我。

static void Main(string[] args) 
{
    StartTasks2();
    Console.ReadKey();
}

private static void StartTasks2() 
{
    Console.WriteLine($"Task2 Started: {DateTime.Now:s.ffff}");
    AddPersonFake();
    Console.WriteLine($"Task2 Finished: {DateTime.Now:s.ffff}");
}

private static async void AddPersonFake() 
{
    Console.WriteLine($"AddPersonFake Started: {DateTime.Now:s.ffff}");
    await Task.Delay(2000);
    Console.WriteLine($"AddPersonFake Finished: {DateTime.Now:s.ffff}");
}

enter image description here

但是此代码不起作用(我正在等待上面的结果):

static void Main(string[] args) 
{
    StartTasks1();
    Console.ReadKey();
}

private static void StartTasks1() 
{
    Console.WriteLine($"Task1 Started: {DateTime.Now:s.ffff}");
    AddPerson();
    Console.WriteLine($"Task1 Finished: {DateTime.Now:s.ffff}");
}

private static async void AddPerson() 
{
    Console.WriteLine($"AddPerson Started: {DateTime.Now:s.ffff}");

    using ( TempDbContext context = new TempDbContext() ) 
    {
        context.Persons.Add(new Person());
        await context.SaveChangesAsync();
    }

    Console.WriteLine($"AddPerson Finished: {DateTime.Now:s.ffff}");
}

enter image description here

如何立即从AddPerson()返回?

1 个答案:

答案 0 :(得分:2)

根据我昨天在StackOverflow上学到的内容,可以使用:

private static async void AddPerson() {
    await Task.Yield();
    Console.WriteLine($"AddPerson Started: {DateTime.Now:s.ffff}");
    using ( TempDbContext context = new TempDbContext() ) {
        context.Persons.Add(new Person());
        await context.SaveChangesAsync();
    }
    Console.WriteLine($"AddPerson Finished: {DateTime.Now:s.ffff}");
}

Task.Yield()将启动未完成的任务,等待它时,异步代码将在此开始。

在您的原始代码中,方法AddPerson正在运行synchronously,直到到达第一个await