【问题标题】:How to connect with database and return values using Async/await task in Web Api controller c#如何在 Web Api 控制器 c# 中使用 Async/await 任务连接数据库并返回值
【发布时间】:2018-02-10 10:16:33
【问题描述】:

您好,我正在尝试连接数据库并从 Web api 控制器返回值。如果可能的话,我想一直与新任务异步执行以获得更好的性能。这是我所做的一个示例.我这样做的方式是否正确?我是否使用正确的 using 语句?在 Open、Close 连接和 sda.FillAsync 中的等待是否正确?谢谢!

 public async Task<HttpResponseMessage> Get()
 {
   return await Task.Run(() => GetAllCustomers());
 }

    private async Task <HttpResponseMessage> GetAllCustomers()
    {
        DataTable Customers= new DataTable();

        using (MySqlConnection con = new MySqlConnection(""))
        using (MySqlCommand cmd = new MySqlCommand("SELECT * FROM Customers", con))
        {
            try
            {
                if (con.State == ConnectionState.Closed)
                {
                    await con.OpenAsync();
                    cmd.CommandType = CommandType.Text;
                    MySqlDataAdapter sda = new MySqlDataAdapter(cmd);
                    await sda.FillAsync(Customers);
                }
            }

            catch (MySqlException ex)
            {
                ex.Message.ToString();
            }
            finally
            {
                await con.CloseAsync();
            }
        }
        return ControllerContext.Request
       .CreateResponse(HttpStatusCode.OK, new { Customers });
    }

【问题讨论】:

  • 更适合CodeReview?
  • public async Task&lt;HttpResponseMessage&gt; Get() AFAIK,建议调用该方法GetAsync
  • 我感觉在 Get() 中不需要明确调用 Task.Run
  • catch (MySqlException ex) { ex.Message.ToString(); - 这完全没用。至少记录一下。但最好返回一个错误响应。
  • 我投票结束这个问题,因为它是一个代码审查请求。

标签: c# mysql asynchronous asp.net-web-api task


【解决方案1】:

替换

return await Task.Run(() => GetAllCustomers());

return await GetAllCustomers();

您不需要显式运行服务任务(控制器方法已经标记为async)。

GetAllCustomers 重命名为 GetAllCustomersAsync(最佳实践命名约定)

我更喜欢这样编写 WebApis:

public async Task<IHttpActionResult> Get() 
{
    try 
    {
         var result = await GetAllCustomersAsync();
         return Ok(result);
    }
    catch(Exception ex) 
    {
        return InternalServerError(ex);
    }
}

更新: 显示如何简化数据库操作的更新:

private async Task<Customers> GetAllCustomersAsync()
{
   var customers = new DataTable();
   using (var con = new MySqlConnection(""))
   using (var cmd = new MySqlCommand("SELECT * FROM Customers", con))
   {
       await con.OpenAsync();
       cmd.CommandType = CommandType.Text;
       var sda = new MySqlDataAdapter(cmd);
       await sda.FillAsync(customers);
   }
   return customers;
}

【讨论】:

  • 谢谢!你知道 Open,Close connection 和 sda.FillAsync 中的 await 是否正确吗?
  • 我看起来不错(尚未测试)。但我会删除 try-catch-finally 块和 try 块内的 if 语句。当您创建新连接时,它将以关闭状态开始。没有必要关闭连接。连接是在 using-block 内创建的,并且会自动释放(dispose = 自动关闭)
猜你喜欢
  • 2017-06-16
  • 2021-03-15
  • 2012-12-13
  • 1970-01-01
  • 2017-08-18
  • 2016-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多