gpt4 book ai didi

c# - SqlDataAdapter.Fill - 异步方法

转载 作者:太空狗 更新时间:2023-10-29 19:40:12 26 4
gpt4 key购买 nike

使用 C#/.NET 3.5。

目前我正在使用 SqlDataAdapter.Fill() 一个接一个地填充 2 个数据表。

我想并行填充这两个数据表,同时通过异步执行每个数据表。但是,没有 Fill() 方法的异步版本 - 即 BeginFill() 会很棒!

我尝试过的一种方法是(伪):

  1. SqlCommand1.BeginExecuteReader//第一个查询,针对 DataTable1
  2. SqlCommand2.BeginExecuteReader//第二个查询,用于 DataTable2
  3. SqlCommand1.EndExecuteReader
  4. SqlCommand2.EndExecuteReader
  5. DataTable1.Load(DataReader1)
  6. DataTable2.Load(DataReader2)

但是,DataTable.Load()需要很长时间:
执行步骤 1 到步骤 4 需要 3 秒。
然后第 5 步需要 22 秒。
第 6 步需要 17 秒。
因此,第 5 步和第 6 步合计 39 秒。

最终结果是,这比一个接一个地执行 2 个 SqlDataAdapter.Fills 没有任何好处。我希望最终结果是整个过程只需要最长查询的时间(或尽可能接近)。

寻找推荐的方法以最终得到真正异步的方法来填充 DataTable。

还是我自己管理它并滚动 2 个单独的线程,每个线程填充一个数据表?

最佳答案

我建议每个线程都有一个单独的工作线程。你可以使用 ThreadPool.QueueUserWorkItem .

List<AutoResetEvent> events = new List<AutoResetEvent>();

AutoResetEvent loadTable1 = new AutoResetEvent(false);
events.Add(loadTable1);
ThreadPool.QueueUserWorkItem(delegate
{
SqlCommand1.BeginExecuteReader;
SqlCommand1.EndExecuteReader;
DataTable1.Load(DataReader1);
loadTable1.Set();
});

AutoResetEvent loadTable2 = new AutoResetEvent(false);
events.Add(loadTable2);
ThreadPool.QueueUserWorkItem(delegate
{
SqlCommand2.BeginExecuteReader;
SqlCommand2.EndExecuteReader;
DataTable2.Load(DataReader2);
loadTable2.Set();
});

// wait until both tables have loaded.
WaitHandle.WaitAll(events.ToArray());

关于c# - SqlDataAdapter.Fill - 异步方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2108917/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com