异步执行会导致数据库到es数据的不一致吗 异步查询数据库_数据

下面介绍一下SQL中异步访问数据

在访问数据时,我们几乎总是没有处理该数据,大多数情况下,我们都在访问另一台机器上的数据,所以应限制在这些机器之间传递的数据量。此外,为了提供系统正在响应的假象,也需要异步访问数据。

异步情切数据的主要方式是使用SqlCommand类,因为这些类包含使用APM的方法,APM提供了BeginExecuteReader和EndExecuteReader方法,并使用IAsyncResult接口。在,net1.0时候就可以使用啦。但是在4.0中,微软添加了Task类,同时也更新了许多内置类的API。使用Task类异步访问数据比以前容易的多得多。

下面介绍一下Task类访问数据,一般编程如下:

public static Task<int> Get()
        {

            using (SqlConnection conn=new SqlConnection (_ConnStr))
            {
                SqlCommand cmd = new SqlCommand("WAITFOR DELAY '0:0:02';select * from ap",conn);
                conn.Open();
                return cmd.ExecuteScalarAsync().ContinueWith(t => Convert.ToInt32(t.Result));
            }

        }

这些代码创建了一个Task对象,它可以等待调用者调用。例如,可以构建从不同的表中读取数据任务吗,并且把它们执行为独立的任务。看起来有点奇怪哈。但他展示了TASK类的一些功能。创建运行很慢的SqlCommand后(延迟2S),就是用ExecuteScalarAsync调用。再使用ContinueWith把第一个任务的返回值转换为整数。

附上ExecuteScalarAsync介绍:

异步执行会导致数据库到es数据的不一致吗 异步查询数据库_线程_02

异步任务的一个常见用法就是分叉和连接,即先把流分叉为一组异步任务,再在所有任务的末尾把它们连接起来。在.net中,使用的Task来实现。可以分叉分叉几个方法,最后调用Task.WaitAll方法,将任务集传递给该方法,把它们结果连接起来。

Task.WaitAll(func1,func2);

在.net4.5中C#添加了async和await关键字,它们可以用于简化任务的一步执行。

public async static Task<int> Get()
        {

            using (SqlConnection conn=new SqlConnection (_ConnStr))
            {
                SqlCommand cmd = new SqlCommand("WAITFOR DELAY '0:0:02';select * from ap",conn);
                conn.Open();
                return await cmd.ExecuteScalarAsync().ContinueWith(t => Convert.ToInt32(t.Result));
            }

        }

异步执行会导致数据库到es数据的不一致吗 异步查询数据库_数据库_03

必须在方法声明添加async关键字,指出这是一个异步方法(await),这样就可以使用异步方法。编译器会自动构建所有异步协调的代码。