Async和Await进程中的实体对象

本文关键字:实体 对象 进程 Await Async | 更新日期: 2023-09-27 17:50:57

我正在尝试使用Async和Await进行上传过程。我创建了一个小代码,看看它是否工作。

class Program
{
    static void Main(string[] args)
    {
        for (int i = 0; i < 5; i++)
        {
            TestAsync().Wait();
        }                
    }
    public static async Task TestAsync()
    {
        await Task.Run(() => {
            Thread.Sleep(1000);
            var context = new CommonEntities();
            context.AddToDummies(new Dummy { TimeStamp = DateTime.Now, Caption = "Async" });
            context.SaveChanges();
        });
    }
}

但由于某种原因,它从未到达Console.WriteLine。如果我用var stringBuilder = new StringBuilder();代替var context = new EntityObject();,那么它就工作了。

这个想法是,我将创建一个方法,它有许多复杂的过程,保存和更新数据库,以及调用web服务和存储结果到数据库等。假设该方法称为MethodA

public static async void test()
{
    await Task.Run(() => MethodA());
}

但在进一步讨论之前,我被困在这个简单的测试中。知道为什么吗?

Async和Await进程中的实体对象

除了事件处理程序,你不应该在任何地方使用async void

async void不允许调用者等待(异步或其他)操作完成,它只是继续前进。在您的示例中,它到达Main的末尾,在您有机会到达Console.WriteLine之前,应用程序就结束了。

您需要更改TestAsync以返回Task并在Main中等待它:

static void Main()
{           
    TestAsync().Wait();
}
public static async Task TestAsync()
{
    await Task.Run(() => 
    {
        var objectContext = new CommonEntities();
        Console.WriteLine("Processed");
    });
}