如何异步使用DataAdapter.Fill()

本文关键字:Fill DataAdapter 异步 何异步 | 更新日期: 2023-09-27 17:57:50

我有一个DataAdapter,它正在数据集中填充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()异步运行吗?

如何异步使用DataAdapter.Fill()

您可以通过以下方式使用多个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;}));
});

通过这种方式,数据将同时使用2个不同的线程加载,而不会冻结表单

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

如何使用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));

编辑

绝对不建议采用建议的解决方案。

数据集似乎不支持并发写入操作:

这种类型对于多线程读取操作是安全的必须同步任何写入操作