zoukankan      html  css  js  c++  java
  • 【译】第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()。

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

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

  • 相关阅读:
    Dubbo的负载均衡
    阿里巴巴为什么不用 ZooKeeper 做服务发现?
    Dubbo注册中心
    史上最全 40 道 Dubbo 面试题及答案
    dubbo面试问题
    iOS7中弹簧式列表的制作
    自动打包
    http://blog.csdn.net/v_july_v/article/details/6543438
    ARC简介以及工程中ARC与非ARC的混合
    iOS开源库–最全的整理
  • 原文地址:https://www.cnblogs.com/talentzemin/p/7359050.html
Copyright © 2011-2022 走看看