下面介绍一下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介绍:
异步任务的一个常见用法就是分叉和连接,即先把流分叉为一组异步任务,再在所有任务的末尾把它们连接起来。在.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));
}
}
必须在方法声明添加async关键字,指出这是一个异步方法(await),这样就可以使用异步方法。编译器会自动构建所有异步协调的代码。