Entity Framework的异步函数不能正常运行。

问题描述 投票:0回答:1

我知道,异步函数会立即返回。下面的示例代码证实了我的观点。

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()?

c# entity-framework
1个回答
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() 将启动incompeleted Task,当等待它的时候,那就是你的异步代码开始的地方。在你的原始代码中,方法 AddPerson 正在运行 synchronously 直到它达到第一个 await

© www.soinside.com 2019 - 2024. All rights reserved.