• 【译】第37节---EF6-异步查询和保存


    原文:http://www.entityframeworktutorial.net/entityframework6/async-query-and-save.aspx

    你可以在.NET4.5下使用 EF6 DbContext异步执行查询和命令。

    我们来看看如何先执行异步查询,然后再看对context.SaveChanges的异步调用。

    异步查询

    private static async Task<Student> GetStudent()
    {
        Student myStudent = null;
    
        using (var context = new SchoolDBEntities())
        {
            Console.WriteLine("Start GetStudent...");
                  
            myStudent = await (context.Students.Where(s => s.StudentID == 1).FirstOrDefaultAsync<Student>());
                
            Console.WriteLine("Finished GetStudent...");
                   
        }
    
        return student;
    }

    上面的代码所示,GetStudent方法使用async关键字标识使其异步。

    异步方法的返回类型必须为Task

    GetStudent返回一个Student实体的对象,所以返回类型必须是Task <Student>。

    此外,查询标记为await。 这将释放调用线程以执行其他操作,直到它执行查询并返回数据。

    我们使用了System.Data.Entity的FirstOrDefaultAsync扩展方法,你也可以适当使用其他扩展方法,例如SingleOrDefaultAsync,ToListAsyn等。

    异步保存

    可以和上面示例一样的方式异步调用context.SaveChanges:

    private static async Task SaveStudent(Student editedStudent)
    {
    
        using (var context = new SchoolDBEntities())
        {
            context.Entry(editedStudent).State = EntityState.Modified;
                    
            Console.WriteLine("Start SaveStudent...");
                    
            int x = await (context.SaveChangesAsync());
                    
            Console.WriteLine("Finished SaveStudent...");
        }
            
    }

    获取异步查询的结果

    异步时可以使用wait方法得到结果,如下:

    public static void AsyncQueryAndSave()
    {
        var queryResult = GetStudent();
                
        Console.WriteLine("Let's do something else till we get student..");
    
        queryResult.Wait();
    
        var student1 = queryResult.Result;
        
        student1.FirstName = "Modified First Name";
                
        var studentSave = SaveStudent(student1);
                
        Console.WriteLine("Let's do something else till we save student.." );
    
        studentSave.Wait();
    
    }

    如上面的代码所示,我们以普通的方式调用Async方法GetStudent,并将引用存储在变量学生中。

    然后,我们调用student.wait()。

    这意味着调用线程应该等待直到异步方法完成,所以我们可以执行另一个进程,直到我们从异步方法得到结果。

    上面显示的代码将具有以下输出:

  • 相关阅读:
    linux系统分析工具续-SystemTap和火焰图(Flame Graph)
    如何使用strace+pstack利器分析程序性能
    MySQL数据类型-decimal详解
    服务器端数据合法性验证:签名sign和口令token原理
    linux系统下php通过php_oci8扩展连接oracle数据库 Nginx
    redis开启远程访问
    cURL函数库错误码说明之PHP curl_errno函数
    权限控制相关模块
    otool
    路由器
  • 原文地址:https://www.cnblogs.com/talentzemin/p/7359050.html
Copyright © 2020-2023  润新知