我制作了一个 C# 应用程序,其中有一个绑定(bind)到数据表的数据网格,并且数据表将从 MySQL 数据库中填充,在方法中使用选择查询。
我有两个问题:
1) 当我第一次加载表时,大约需要 8 秒(仅 6 行),下一次只需不到 2 秒。为什么第一次查询这么慢?
2) 我制作了一个包含 10000 行的测试表,尝试加载它,但应用程序停止了!
我制作了一个新的 WPF 项目,并使用相同的代码从 MySQL 获取行,它运行得很好,数据网格在 10 秒后显示数据。
我使用任务使选择查询方法异步,在第一个项目中尝试过,但没有任何改变!
对于我提出的第二个问题,可能与我的电脑有关,我正在使用:
Pentium dual core CPU,2.7 GHz and 2.69 GHz
4 GB RAM,Windows 10,64 bit
但是如果这是来 self 的电脑,那么新项目也必须面对这个问题并崩溃,但它没有发生!我也使用DatabaseBrowser应用程序,这没有问题。
这是我的代码,MainWindow 调用我制作的 MySQL 类中的“SelectQuery”方法:
public MySqlConnection connection()
{
Properties.Settings.Default.Reload();
MySqlConnection conn = new MySqlConnection(Properties.Settings.Default.con); // con is string defined in properties, Settings.settings
return conn;
}
public async Task<string> SelectQuery(string tablename, DataGrid dg, DataTable dt)
{
Task<bool> task = new Task<bool>(()=>Select(tablename,dt));
task.Start();
bool IsComplete = await task;
if (IsComplete == true)
{
dg.ItemsSource = dt.DefaultView;
return "0";
}
else
return "";
}
public bool Select(string tablename, DataTable dt)
{
MySqlConnection conn = connection();
try
{
string commandquery = "select SQL_NO_CACHE * from " + tablename+ " ORDER BY ID DESC";
conn.Open();
MySqlCommand c = new MySqlCommand("SET ARITHABORT ON", conn);
MySqlCommand com = new MySqlCommand(commandquery, conn);
MySqlDataReader adp = com.ExecuteReader();
//MySqlDataAdapter adp = new MySqlDataAdapter(commandquery,conn);
dt.Clear();
//adp.Fill(dt);
dt.Load(adp);
return true;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Error", MessageBoxButton.OK, MessageBoxImage.Error, MessageBoxResult.OK, MessageBoxOptions.RtlReading);
return false;
}
finally
{
conn.Close();
}
}
我尝试了 MySqlDataReader 和 MySqlDataReader,但没有任何变化。
我逐行检查了代码,第一次 MySqlCommand com = new MySqlCommand(commandquery, conn);
大约需要 8 秒,然后不到 1 秒,大约 500 毫秒。
对于第一个项目中具有 10000 行的测试表,以上所有行都运行得很快,完成后,应用程序崩溃,所以问题来 self 的应用程序,但我不知道问题出在哪里,其他表运行良好!
我检查了内存使用情况,对于其他表,使用情况很好,但对于 10000 个表的内存只是增加,应用程序在一秒钟后没有响应。
有什么建议可以解决这个问题吗?
使用 php 从数据库获取数据并将其发送到 C# 应用程序是否更快?
我在谷歌上搜索了很多关于我的问题的东西,看到了很多解决方案,但无法解决它。
更新:
我意识到我的第二个问题(应用程序崩溃)是因为将 scrollviewer.cancontentscroll
设置为 false
导致 RAM 使用量增加过多。
如果不将其设置为 false,则会出现其他问题;数据网格失去平滑滚动!
最佳答案
解决方案:
我无法修复第一个选择查询延迟。
但对于第二个问题,我将“Select”方法设为异步,并将每次加载行数限制更改为 50,并且在滚动达到滚动高度的 90% 后,将加载下一页(接下来的 50 行),依此类推。
我认为这是最好的方法,因为加载大量数据肯定会消耗大量 RAM 和 CPU,并且通过滚动加载比制作页面按钮更好。
如果将 scrollviewer.cancontentscroll
设置为 false
,RAM 使用量会增加,因此最好使用几行,因此可以将其设置为 false
>(这是平滑滚动所必需的)。
关于c# - C# WPF 中 MySQL 选择查询缓慢并崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43075796/