任务/等待填充DataTable-没有性能改进



这是我第一次尝试学习如何使用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((;

看,这个有一个异步方法。打开连接时也是如此。

相关内容

  • 没有找到相关文章