【发布时间】:2017-03-28 17:10:37
【问题描述】:
我做了一个 c# 应用程序,其中一部分是绑定到数据表的数据网格,数据表将从 MySQL 数据库中填充,使用方法中的选择查询。
我有两个问题:
1)当我第一次加载一个表时,大约需要 8 秒(只有 6 行),下一次只需不到 2 秒。为什么第一次查询这么慢?
2) 我制作了一个包含 10000 行的测试表,尝试加载它但应用停止了!
我创建了一个新的 WPF 项目并使用相同的代码从 MySQL 获取行,它工作得很好,数据网格在 10 秒后显示数据。
我使用任务使选择查询方法异步,在第一个项目中尝试过,但没有任何改变!
对于我提出的第二个问题,它可能与我的电脑有关,我正在使用:
奔腾双核 CPU,2.7 GHz 和 2.69 GHz
4 GB 内存,Windows 10,64 位
但是如果这是来自我的PC,那么新项目也必须面对这个问题并崩溃,但它没有发生!我也使用了 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 行的测试表,上述所有行运行速度很快,完成后应用程序崩溃,所以问题出在我的应用程序上,但我不知道问题出在哪里,其他表运行良好!
我检查了内存使用情况,对于其他表,使用情况很好,但是对于 10000 表的内存只是增加并且应用程序在几秒钟后没有响应。
有什么解决这个问题的建议吗?
使用 php 从数据库获取数据并将其发送到 C# 应用程序是否更快?
我为我的问题搜索了很多东西,看到了很多解决方案,但无法解决。
更新:
我意识到我的第二个问题(应用程序崩溃)是因为将 scrollviewer.cancontentscroll 设置为 false 会过多地增加 RAM 使用量。
如果不将此设置为 false,则会出现其他问题; datagrid 失去平滑滚动!
【问题讨论】: