【问题标题】:Slow MySQL select query and crash in C# WPF在 C# WPF 中缓慢的 MySQL 选择查询和崩溃
【发布时间】: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 失去平滑滚动!

【问题讨论】:

    标签: c# mysql wpf database


    【解决方案1】:

    解决方案
    我无法修复第一次选择查询延迟。
    但是对于第二个问题,我使我的“选择”方法异步并将加载行限制更改为每次 50,并且在滚动达到滚动高度的 90% 后,将加载下一页(接下来的 50 行)等等。
    我认为这是最好的方法,因为加载大量数据肯定会消耗大量 RAM 和 CPU,并且通过滚动加载比制作页面按钮更好。
    如果将scrollviewer.cancontentscroll设置为false,RAM使用会增加,所以最好使用几行,然后设置为false(这是平滑滚动所必需的)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-27
      • 1970-01-01
      • 2016-11-21
      • 2019-04-15
      • 2011-08-04
      • 2022-10-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多