【发布时间】:2017-02-12 23:08:52
【问题描述】:
我必须说我已经阅读这个网站很长时间了,并且总能找到我想要的东西。遗憾的是,今天并非如此。
我有一个 .NET C# Winforms 应用程序,它使用 MySQL .NET 连接器来查询数据库并用结果填充 DataGridView。
这是我的代码:
using (var SqlConn = new MySqlConnection(MyConnectionString)
{
using (var SqlComm = new MySqlCommand("SELECT * FROM my_database.city", SqlConn)
{
using (var SqlAdapter = new MySqlDataAdapter(SqlComm)
{
DataTable SqlOutput = new DataTable();
SqlAdapter.Fill(SqlOutput);
myDataGridView.DataSource = SqlOutput;
}
}
}
代码运行良好。问题是,考虑到表格有 20K 行,加载需要一些时间,同时它会阻塞 UI。
做了一些测试,我得出的结论是数据库查询 Fill() 非常快(实际上需要 10 毫秒)。 因此,设置 DataGridView.DataSource 属性会延迟整个操作。
所以我的问题是,有没有办法将 DataSource 属性设置为异步?或者也许是我在加载数据时仍然可以使用表单的一种方式?
我还想知道是否有更好的方法来执行此操作,因为每次我对数据库表进行更改时都会调用此方法,以便向用户显示更新的信息。
提前致谢。
【问题讨论】:
-
20K 行太多,无法在
DataGriView中显示。最好用分页加载数据。此外,为了防止加载数据时 UI 冻结,请使用 async/await 或在与 UI 线程不同的线程中加载数据。 Example: Load data asynchronously into my DataTable in Windows Forms -
@RezaAghaei 我确实有一个实现 MySqlDataAdapter.FillAsync 方法的 async/await 方法。但是从数据库中提取的数据实际上并没有冻结 UI,设置 DataSource 属性可以。而且我仍然会同步执行该步骤。你能告诉我更多关于通过分页加载它的信息吗?
-
所以在virtual mode 中使用
DataGridView或分页加载数据。
标签: c# mysql winforms datagridview