C#Datagridview在应用程序生命周期的第一次使用时挂起应用程序

C#Datagridview在应用程序生命周期的第一次使用时挂起应用程序,c#,winforms,datagridview,C#,Winforms,Datagridview,我们在一个C#windows窗体应用程序中遇到了一个无法解释的问题,我们已经使用了多年,并且我们定期更改其功能和错误修复。 问题是,我们有一个应用程序冻结,这发生在应用程序使用一段时间后不久。(我不想说启动,因为它做了很多事情,而且在启动程序中从不冻结) 在解决了很多问题之后,我们将其范围缩小到第一次使用datagridview对象时,无论是否涉及数据库。i、 e即使我们从静态代码(作为测试)中构建的数据表中显示datagridview,它也会挂起几秒钟,非常明显GUI停止,它确实不同。(应用程

我们在一个C#windows窗体应用程序中遇到了一个无法解释的问题,我们已经使用了多年,并且我们定期更改其功能和错误修复。 问题是,我们有一个应用程序冻结,这发生在应用程序使用一段时间后不久。(我不想说启动,因为它做了很多事情,而且在启动程序中从不冻结)

在解决了很多问题之后,我们将其范围缩小到第一次使用datagridview对象时,无论是否涉及数据库。i、 e即使我们从静态代码(作为测试)中构建的数据表中显示datagridview,它也会挂起几秒钟,非常明显GUI停止,它确实不同。(应用程序时间的年龄)。 在初始挂起之后,该应用程序会话不会再次发生挂起。您再次进入完全相同的模块-相同的代码-状态没有更改,并且执行速度很快

该应用程序用于部署到windows 7的kiosk环境,该环境中嵌入了写筛选器,只有极少数进程在explorer.exe未运行时运行,其他任何进程也不会启动。 我们只有几种不同的硬件,这是一个“所有的都必须是相同类型的系统”。 我们从未在任何仅部署的开发人员计算机上看到问题清单。 该应用程序的目标是.NET4.5.2

datagridview的大多数设计器(自动)代码看起来都是这样的,VS编写时应该是标准的

private System.Windows.Forms.DataGridView datagridView;
this.datagridView = new System.Windows.Forms.DataGridView();
((System.ComponentModel.ISupportInitialize)(this.datagridView)).BeginInit();
this.datagridView.AllowUserToAddRows = false;
this.datagridView.AllowUserToDeleteRows = false;
this.datagridView.ColumnHeadersHeightSizeMode = 

System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
this.datagridView.Location = new System.Drawing.Point(31, 128);
this.datagridView.Name = "datagridView";
this.datagridView.ReadOnly = true;

this.datagridView.RowTemplate.DefaultCellStyle.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.datagridView.Size = new System.Drawing.Size(732, 220);
this.datagridView.TabIndex = 144;
我们主要通过创建datatable并将其添加为源来使用datgridview。自定义类通常只是数据结构,因此它们不访问DBs或任何组合在一起的简单基元类型

DataTable table = new DataTable("tableName");

DataColumn c0 = new DataColumn("col1");
DataColumn c1 = new DataColumn("Col2");

table.Columns.Add(c0);
table.Columns.Add(c1);
foreach (CustomClass item in items)
{
    DataRow row;
    row = transTable.NewRow();
    row["col1"] = item.something;
    row["col2"] = item.something;
    transTable.Rows.Add(row);
}

datagridView.DataSource = table;
唯一需要补充的一点是,除了我们认为我们快疯了之外,还需要提到的是,这可能已经(我说可能是因为我们无法证明这一点。)我们可能已经在visio环境中完成了一个汇总包,以便在实际的编码机上汇总5。Visio Studio 2013正在使用中,但我认为这是一个很好的例子

有什么想法吗


提前谢谢。

您有多少件物品??另外,我建议将“项”直接绑定到datagrid,看看它的fasterIt是否应该简单,以跟踪导致免费的特定功能,然后相应地修复它。使用跟踪或日志记录时间。在表单上加载。Debug.Writeline(System.DateTime.Now.ToString(“yyyy-MM-dd-hhmmss”);这应该在任何方法调用之前和之后使用,或者只在昂贵的方法之后使用。查看哪个方法花费的时间更长。很可能是从数据库加载数据或迭代此数据。我刚刚给出了建议,请根据方便使用日志记录或跟踪。在代码中跟踪时间时,使用,而不是日期时间。有关更多信息,请参阅问题关于为什么考虑到上述因素,为什么我们第二次调用相同的代码和数据会更快?项目的数量与此无关,因为我们甚至可以使用0行。我们对此感到困惑。@user3725237我们在一些自制控件上遇到了类似的问题。第一次init非常慢,我相信是JITcomp我们的解决方案是在启动时在后台线程中加载这些对象。然后,当我们第二次创建真实对象时,它们就可以正常工作了。这是一个黑客行为。你有多少项?另外,我建议绑定“项”直接到datagrid,查看fasterIt是否应该简单,以跟踪导致free的特定功能,然后相应地修复它。使用跟踪或日志记录时间。On Form load.Debug.Writeline(System.DateTime.Now.ToString(“yyyy-MM-dd-hhmms”);这应该在任何方法调用之前和之后使用,或者只在昂贵的方法之后使用。查看哪个方法花费的时间更长。很可能是从数据库加载数据或迭代此数据。我刚刚给出了建议,请根据方便使用日志记录或跟踪。在代码中跟踪时间时,使用,而不是日期时间。有关更多信息,请参阅问题关于为什么考虑到上述因素,为什么我们第二次调用相同的代码和数据会更快?项目的数量与此无关,因为我们甚至可以使用0行。我们对此感到困惑。@user3725237我们在一些自制控件上遇到了类似的问题。第一次init非常慢,我相信是JITcomp我们的解决方案是在启动时在后台线程中加载这些对象。然后,当我们第二次创建真实对象时,它们就可以正常工作了。这是一种黑客行为。