如何解决任务/等待填充数据表-没有性能提升
这是我第一次尝试学习如何使用Task / await,我承认自己很挣扎。它似乎不会比我使用它之前更快地放开用户界面。
我正确使用了吗?我知道我不太了解Task / await,因此,如果可以的话,对我自己的代码进行修改后的版本将非常有用。
这是我调用任务方法的方式:
DataTable dt = await datalayer.GetDocumentInfo (InvestigationID);
这是填充我的数据表的代码:
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;
}
解决方法
如果您期望性能提高,那么您将完全错误地吠叫。异步/等待是一种保存线程的机制,而不是一种使事情更快的机制,特别是如果它们花在任何事情上的时间取决于外部系统。
示例:订购比萨(通过电话订购)
- 同步:您告诉您的朋友点菜,等他吃完,站在他旁边。
- 异步:您告诉您的朋友订购它,他回来并告诉您他订购了它。
这两种操作都需要花费相同的时间,但是在异步情况下,您可以在朋友打电话的同时继续看电视,而在同步情况下,您必须站在他旁边来打电话。
异步情况可能会花费更长的时间(您需要等待您的朋友回来),但是在此期间您可以执行其他操作。
在我们进行代码审查时:
SqlDataReader dr = cmd.ExecuteReader(); //dt.Load(dr); 等待Task.Run(()=> dt.Load(dr));
这很糟糕。这实际上是在告诉您的其他朋友等一下,观察您的第一个朋友在打电话,然后向您报告-除了浪费别人的时间以外,什么都没有得到。
没有什么反对的,而是使用它的正确方法来使用它。直。而且这里的数据表变得很糟:数据表很旧,并且没有适当的异步支持。
Fill DataTable asynchronously?深入解释了为什么这样做根本不明智。
您会发现大多数人不使用数据表。根本-在99.999%的情况下,EntityFramework等人可以更好,更快地工作很多。
不过,您可以至少替换一下:
SqlDataReader dr = cmd.ExecuteReader();
使用
var dr =等待cmd.ExecuteReaderAsync();
看,这有一个异步方法。打开连接后也一样。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。