c# - C# WPF 中 MySQL 选择查询缓慢并崩溃

标签 c# mysql wpf database

我制作了一个 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/

相关文章:

mysql - 从一个表中获取所有行,前提是从 mysql 中的另一表满足特定条件

mysql - MySQL查询的ORDER BY和GROUP BY

c# - WPF 中 RichTextBox 内的光标位置

c# - 我们如何捕获 xamDataGrid 中的行删除通知?

c# - 如何将自定义列添加到 MvcContrib 网格?

c# - 如何使用 HttpTaskAsyncHandler

c# - 将 64 位数组转换为 Int64 或 ulong C#

c# - 继承,需要建议

mysql - 如何查找和禁用 MySQL 严格模式?

c# - 创建TextBlock时我可以知道它的宽度吗?