这是我第一次尝试学习如何使用Task/await,我承认我很挣扎。它似乎并没有比我使用它之前更快地放开我的用户界面
我用对了吗?我知道我并不真正理解Task/await,所以如果可以的话,我自己的代码的修改版本会很好。
以下是我如何称我的任务方法:
DataTable dt = await datalayer.GetDocumentInfo (InvestigationID);
这是我的代码,它填充了我的DataTable:
public async Task<DataTable> GetDocumentInfo (Guid InvestigationID) {
DataTable dt = new DataTable();
using (new Impersonator.Impersonator (UserLogin, UserDomain, UserPassword)) {
using (SqlConnection cn = new SqlConnection (ConnectionString)) {
// Specify which stored procedure to use and add a parameter.
SqlCommand cmd = new SqlCommand ("GetDocumentInfo", cn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue ("@InvestigationID", InvestigationID);
// Put the returned record into a datatable.
cn.Open();
SqlDataReader dr = cmd.ExecuteReader();
//dt.Load (dr);
await Task.Run(() => dt.Load (dr));
cmd.Dispose();
}
} // Impersonator
return dt;
}
如果您期望性能改进,那就大错特错了。Async/await是一种保存线程的机制,而不是一种使事情更快的机制,尤其是当它们在任何事情上花费的时间依赖于外部系统时。
示例:订购披萨(通过电话订购(
- 同步:你告诉你的朋友点餐,然后站在他旁边等他吃完
- 异步:你告诉你的朋友点了,他回来告诉你他点了
两种操作都需要相同的时间,但在异步情况下,你可以在朋友打电话时继续看电视,而在同步情况下,您必须站在他旁边打电话。
异步情况可能需要更长的时间(你需要等待你的朋友回来(,但在此期间你可以做其他事情。
当我们进行代码审查时:
SqlDataReader dr=cmd。ExecuteRead((;//dt负荷(dr(;等待任务。Run(((=>dt。荷载(dr((;
这太糟糕了。这实际上是告诉你的另一个朋友等着,观察你的第一个朋友打电话,然后向你汇报——除了浪费别人的时间,什么都没有得到。
没有什么反对等待,但使用它的正确方式。直接使用它。在这里,您的数据表变得很糟糕:数据表很旧,对异步没有适当的支持。
异步填充DataTable?有一个深入的解释,为什么这是不明智的。
你会发现大多数人不使用数据表。总之,EntityFramework等人在99.999%的情况下工作得更好、更快。
不过,你至少可以取代这个:
SqlDataReader dr=cmd。ExecuteRead((;
使用
var dr=等待cmd。ExecuteReaderAsync((;
看,这个有一个异步方法。打开连接时也是如此。