0

标准很简单。我正在使用 C# 4.0 开发一个 winform 应用程序,并且有一个带有网格视图的 win 表单。在加载事件中,我从数据库中检索数据,然后将数据源分配给 gridview。我使用 BackGroundWorker 对象进行数据库检索。这很好。我的 GUI 是响应式的。记录超过约 10 lac。所以我使用后台工作人员填充我的数据表,然后将数据表分配给gridview。问题是,我的系统变慢了。当我最小化我的应用程序的 mdi 形式并尝试做其他事情,比如打开互联网浏览器和其他东西时,我的电脑变慢了。我有核心 i3 2ith 2GB RAM。具有 10 条 lac 记录的网格使我的系统变慢。在这种情况下如何管理内存?这是代码:

BackgroundWorker bWorker; 数据表 dt;

    public Form1()
    {
        InitializeComponent();
        bWorker = new BackgroundWorker();
        bWorker.DoWork += new DoWorkEventHandler(m_oWorker_DoWork);
        bWorker.ProgressChanged += new ProgressChangedEventHandler(m_oWorker_ProgressChanged);
        bWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(m_oWorker_RunWorkerCompleted);
        bWorker.WorkerReportsProgress = true;
        bWorker.WorkerSupportsCancellation = true;
    }

    void m_oWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        dataGridView1.DataSource = dt;
        pictureBox1.Visible = false;
        //progressBar1.Style = ProgressBarStyle.Blocks;
        //label1.Text  = "Data Loaded Successfully!";
        this.Hide();
        this.Show();
    }

    void m_oWorker_DoWork(object sender, DoWorkEventArgs e)
    {
        dt = getDataTable();
        //bWorker.ReportProgress(100);
    }
    void m_oWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        //Here you play with the main UI thread
        //progressBar1.Value = e.ProgressPercentage;
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        bWorker.RunWorkerAsync();

    }
    private DataTable getDataTable()
    {
        string conStr = ConString;
        SqlConnection con = new SqlConnection(conStr);
        SqlCommand cmd = new SqlCommand("Select *from testtable",con);
        SqlDataAdapter da = new SqlDataAdapter(cmd);
        dt = new DataTable();
        try
        {
            da.Fill(dt);
            return dt;
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.ToString());
            return null;
        }
    }

请指导我如何管理内存,以免系统变慢。如果我在将数据表分配给网格后处理它,那会有帮助吗?

我其实是个初学者。并希望获得有关内存管理的完整指南。申请应该很快。谢谢

4

4 回答 4

3

您不能期望将一百万行数据加载到 GUI 控件中并期望一切都运行良好,对吗?

问题在这里:

SqlCommand cmd = new SqlCommand("Select *from testtable",con);

你不可能SELECTing 整张桌子。您LIMIT只希望查询 GUI 可以合理显示的那些行。完全在黑暗中拍摄,我会说最多大约一千行。

于 2013-05-15T06:55:01.197 回答
3

您的问题很可能是您的 DataGridView 为结果集中的每一行创建一行。您应该了解什么是虚拟显示模式VirtualMode 属性以及如何实现它

于 2013-05-15T06:59:12.650 回答
0

我的假设是您尝试在 getDataTable 中加载所有这些 rocords。为什么不按需加载?即只加载第一级负载。如果所有这些都是第一级,您可以分成多个页面,其大小可能是屏幕宽度。

于 2013-05-15T06:56:31.733 回答
0

您可以使用 DataGrid 控件来设置所有适当的选择、插入、更新、删除语句,添加分页规则,这也很有效。网格不会一次加载所有记录,而是使用巧妙的内部功能从数据库中选择并仅显示适当的数据。希望这也有帮助。

于 2013-05-15T07:15:20.130 回答