【发布时间】:2014-10-22 21:37:34
【问题描述】:
鉴于以下代码,我有几个关于最佳实践的问题:
string connectionString = @"Server=(local)\sqlexpress; Database=master; Integrated Security=true;";
using (SqlConnection connection = new SqlConnection(connectionString))
{
using (SqlDataAdapter dataAdapter = new SqlDataAdapter("select * from information_schema.columns", connection))
{
await connection.OpenAsync();
DataTable dataTable = new DataTable();
await Task.Run(() => dataAdapter.Fill(dataTable));
return dataTable;
}
}
我已经看到了几个将整个代码块包装在 Task.Run() 调用中的示例,但我不确定这是否比仅为 DataAdapter.Fill() 方法调用 Task.Run() 更好,感觉更加灵活和具体(仅在异步任务上使用 await)。
在 Fill() 方法上调用 Task.Run() 的方法是否比包装整个代码块更好?
在 Task.Run() 中调用 Fill() 是否有任何负面影响?如果 Fill() 出错,我正在考虑丢失调用堆栈和/或异常信息。
有没有更好的方法在 ASP.NET 中编写这个?
【问题讨论】:
-
为什么不把 all 的代码放在异步方法中?也就是说,移动任务以包含整个 SQL 连接生命周期,包括填充 DataTable。
-
这是 ASP.NET 还是 GUI?
-
@AdrianAnttila 无论如何,就异常处理而言,请参阅 - stackoverflow.com/questions/5383310/… 异常被维护并传播到 调用
await的代码,就像上下文一样。跨度> -
Task.Run 在 Web 应用程序中几乎没有帮助。它究竟会改进什么?
-
它可以通过并行工作来提高请求的性能,并且它还创建了一个高度并发的服务器,因为您没有对该请求进行锁定,服务器可以继续接受其他请求而那个正在处理。所以我相信,如果使用得当,你在某些场景下会有优势。
标签: c# asynchronous ado.net dataadapter