2017-10-18 101 views
0

使用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(); 
    } 
} 

回答

1

OpenAsync()将立即从方法(GetListAsync)返回到调用它的方法,以便线程可以自由地在此期间做其他事情。例如,假设打开连接需要一秒钟(例如),那么线程可以执行其他操作。连接的打开不会由调用它的线程完成。

一旦打开了连接,执行将转到下一行是:

var tickets = await connection.QueryAsync<Ticket>(sql.ToString()); 

:请在某些情况下,注意,如果IsCompleted返回true,则这将是同步完成的。

+0

所以使用OpenAsync有一个好处,而不是保持它主线程和可能阻塞的权利? –

+0

@blakerivell是的,但一切都要看情况。基本上这个线程并不忙碌,它可以自由地做其他事情,比如响应点击按钮或显示进度条等,这取决于你如何使用空闲时间。如果你在空闲时间没有做任何事情,那么这是不利的。事实上,这是不好的,因为上下文切换需要时间,如果你在空闲时间内什么也不做,那么你没有理由切换上下文。 – CodingYoshi

+0

如果10个独立用户单击一个从UI同时调用类似GetUserList的API方法的按钮,那么从Web API控制器一直到存储库使用异步方法会使我受益吗?我会承认是的,因为每个请求都可以在单独的线程上处理。否则,每次使用都必须等待先前的用户获得正确的响应? –

0

根据source codeOpenOpenAsyncDbConnection

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,您不必在内部打开连接,如果方法关闭,该方法会打开连接。

+0

我明白你的意思,如果短链接的查询或查询同步函数在打开的情况下会打开连接? –

+0

@BlakeRivell看看Dapper的源代码https://github.com/StackExchange/Dapper/blob/071a3fd5a0e9a3ebb9b598737b94b49c56446722/Dapper/SqlMapper.Async.cs#L388 – Nkosi

相关问题