代码之家  ›  专栏  ›  技术社区  ›  Blake Rivell

连接之间的差异。OpenAsync和连接。使用Dapper QueryAsync方法时打开

  •  6
  • Blake Rivell  · 技术社区  · 7 年前

    使用连接有什么区别。OpenAsync()和连接。使用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();
        }
    }
    
    2 回复  |  直到 7 年前
        1
  •  6
  •   CodingYoshi    7 年前

    OpenAsync() 将立即从方法返回( GetListAsync )调用它的方法,使线程可以同时自由地做其他事情。例如,假设打开连接需要一秒钟(仅举个例子),那么线程可以做其他事情。连接的打开将不会由调用它的线程完成。

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

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

    笔记 :请注意,在某些情况下 IsCompleted

        2
  •  6
  •   Nkosi    7 年前

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