首页 > 解决方案 > 任务/等待填充数据表 - 没有性能改进

问题描述

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

}

标签: c#winformsdatatableasync-awaittask

解决方案


如果您期望性能有所提高,那您就完全找错了树。Async/await 是一种保存线程的机制,而不是一种使事情变得更快的机制,特别是如果他们花在任何事情上的时间取决于外部系统。

示例:订购披萨(通过电话订购)

  • 同步:你告诉你的朋友点菜,等他吃完,站在他旁边。
  • 异步:您告诉您的朋友订购它,他回来告诉您他订购了它。

这两个操作将花费相同的时间,但在异步情况下,您可以在朋友打电话时继续看电视,而在同步情况下,您必须站在他旁边打电话。

异步情况可能需要更长的时间(您需要等待您的朋友回来),但您可以在此期间做其他事情。

当我们进行代码审查时:

SqlDataReader dr = cmd.ExecuteReader(); //dt.Load (dr); 等待 Task.Run(() => dt.Load (dr));

这已经很糟糕了。这实际上是在告诉您的另一个朋友等待并观察您的第一个朋友打电话然后向您报告 - 除了浪费另一个人的时间之外,没有任何收获。

没有什么反对等待,而是使用它的正确方法来使用它。直接地。在这里你的数据表变坏了:数据表很旧,对异步没有适当的支持。

异步填充DataTable?对为什么这根本不明智有深入的解释。

你会发现大多数人不使用数据表。完全 - EntityFramework 等人在 99.999% 的情况下工作得更好更快。

但是,您至少可以替换它:

SqlDataReader dr = cmd.ExecuteReader();

var dr = 等待 cmd.ExecuteReaderAsync();

看,这个有一个异步方法。与打开的连接相同。


推荐阅读