connection.OpenAsync和connection.Open之间的区别使用Dapper QueryAsync方法时打开
使用dapper的QueryAsync方法时,使用connection.OpenAsync()和connection.Open()有什么区别。connection.OpenAsync和connection.Open之间的区别使用Dapper QueryAsync方法时打开
异步:
public async Task<IList<Product>> GetListAsync()
{
using (var connection = new SqlConnection(_connectionString))
{
StringBuilder sql = new StringBuilder();
sql.AppendLine("SELECT Id, Name ");
sql.AppendLine("FROM Product ");
await connection.OpenAsync();
var tickets = await connection.QueryAsync<Ticket>(sql.ToString());
return tickets.ToList();
}
}
不是异步:
public async Task<IList<Product>> GetListAsync()
{
using (var connection = new SqlConnection(_connectionString))
{
StringBuilder sql = new StringBuilder();
sql.AppendLine("SELECT Id, Name ");
sql.AppendLine("FROM Product ");
connection.Open();
var tickets = await connection.QueryAsync<Ticket>(sql.ToString());
return tickets.ToList();
}
}
OpenAsync()
将立即从方法(GetListAsync
)返回到调用它的方法,以便线程可以*地在此期间做其他事情。例如,假设打开连接需要一秒钟(例如),那么线程可以执行其他操作。连接的打开不会由调用它的线程完成。
一旦打开了连接,执行将转到下一行是:
var tickets = await connection.QueryAsync<Ticket>(sql.ToString());
注:请在某些情况下,注意,如果IsCompleted
返回true,则这将是同步完成的。
根据source code为Open
和OpenAsync
为DbConnection
,
abstract public void Open();
public Task OpenAsync() {
return OpenAsync(CancellationToken.None);
}
public virtual Task OpenAsync(CancellationToken cancellationToken) {
TaskCompletionSource<object> taskCompletionSource = new TaskCompletionSource<object>();
if (cancellationToken.IsCancellationRequested) {
taskCompletionSource.SetCanceled();
}
else {
try {
Open();
taskCompletionSource.SetResult(null);
}
catch (Exception e) {
taskCompletionSource.SetException(e);
}
}
return taskCompletionSource.Task;
}
OpenAsync
只是为了允许等待异步代码,而不阻塞线程。
现在使用Dapper,您不必在内部打开连接,如果方法关闭,该方法会打开连接。
我明白你的意思,如果短链接的查询或查询同步函数在打开的情况下会打开连接? –
@BlakeRivell看看Dapper的源代码https://github.com/StackExchange/Dapper/blob/071a3fd5a0e9a3ebb9b598737b94b49c56446722/Dapper/SqlMapper.Async.cs#L388 – Nkosi
所以使用OpenAsync有一个好处,而不是保持它主线程和可能阻塞的权利? –
@blakerivell是的,但一切都要看情况。基本上这个线程并不忙碌,它可以*地做其他事情,比如响应点击按钮或显示进度条等,这取决于你如何使用空闲时间。如果你在空闲时间没有做任何事情,那么这是不利的。事实上,这是不好的,因为上下文切换需要时间,如果你在空闲时间内什么也不做,那么你没有理由切换上下文。 – CodingYoshi
如果10个独立用户单击一个从UI同时调用类似GetUserList的API方法的按钮,那么从Web API控制器一直到存储库使用异步方法会使我受益吗?我会承认是的,因为每个请求都可以在单独的线程上处理。否则,每次使用都必须等待先前的用户获得正确的响应? –