DataAdapter.Fill() 如何异步使用?

5

我有一个DataAdapter,它正在填充一个DataSet中的5个DataTables。

SqlDataAdapter da = new SqlDataAdapter("Select * from testTable",con);
da.Fill(ds, 0, numberOfRowsToPutInEachDataTable, "DT1");
da.Fill(ds, numberOfRowsToPutInEachDataTable , numberOfRowsToPutInEachDataTable , "DT2");
da.Fill(ds, numberOfRowsToPutInEachDataTable* 2, numberOfRowsToPutInEachDataTable, "DT3");
da.Fill(ds, numberOfRowsToPutInEachDataTable * 3, numberOfRowsToPutInEachDataTable, "DT4");
da.Fill(ds, numberOfRowsToPutInEachDataTable * 4, numberOfRowsToPutInEachDataTable, "DT5");

我的目标是获取每个

da.Fill...

同时异步运行。

我没有异步运行的经验,而且在研究中也很难找到解决方法。有人能告诉我如何让每个DataAdapter.Fill()都以异步方式运行吗?


不要把一些行放在这里,另一些行放在那里,你可以加载它们并使用DataView将它们分页显示,每页显示500行或其他数量 - 如果这是将它们分割的原因。 - Ňɏssa Pøngjǣrdenlarp
3
DataAdapter 没有异步方法可用,您只能使用任务来完成,尽管可能有更好的解决方案来解决您的问题。 - David L
让它们同时运行是我唯一的要求。 - Reeggiie
@DavidL 我如何使用任务来实现这个? - Reeggiie
1
@Reeggiie 我建议创建5个单独的分页查询,并在单独的适配器中执行它们,这些适配器可以在新任务中启动。或者更好的是,我会完全避免这种类型的事情。 - David L
目前正在努力将异步功能实现到.NET中的DataAdapter.Fill函数中,详情请见https://github.com/dotnet/runtime/issues/22109。 - Lachlan Ennis
2个回答

3
您可以使用多个线程运行多个 Task.Run(),如下所示:
Task.Run(() =>
{
    da1.Fill(ds.Table1);
    this.Invoke(new Action(() => {dataGridView1.DataSource = ds.Table1;}));
});
Task.Run(() =>
{
    da2.Fill(ds.Table2);
    this.Invoke(new Action(() => {dataGridView2.DataSource = ds.Table2;}));
});

这样数据就可以使用两个不同的线程同时加载,而不会冻结表单。

在上面的代码中,da1.Fillda2.Fill 将在不同的线程中同时调用。由于代码在执行不同的线程而不是 UI 线程,要设置 DataGridViewDataSource,应该使用 Invoke


-1

使用 PLINQ 怎么样:

SqlDataAdapter da = new SqlDataAdapter("Select * from testTable", con);

IEnumerable<int> results = new string[]
{
    "DT1", "DT2", "DT3", "DT4", "DT5"
}
.AsParallel()
.Select((table, index) => da.Fill(ds, 
                          numberOfRowsToPutInEachDataTable * index, 
                          numberOfRowsToPutInEachDataTable, 
                          table));

编辑

建议的解决方案绝对不被推荐。

看起来DataSet不支持并发写操作:

这种类型适用于多线程读操作。 您必须同步任何写操作


1
这段代码运行没有错误,但是在执行结束时我的5个数据表仍然为空。我需要改变什么吗? - Reeggiie
@Reeggiie 请查看更新的答案。DataSet 不支持并发写入访问。 - Matias Cicero

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接