gpt4 book ai didi

c# - DataGridView 性能与 BindingList 数据源相结合

转载 作者:行者123 更新时间:2023-11-30 15:04:19 24 4
gpt4 key购买 nike

我正在构建一个必须显示从外部系统接收的数据的应用程序。这些数据可以很快进入,而每行占用的字节数相对较小。这意味着每个时间单位必须添加很多行。我目前处于接收数据速度快于我处理能力的地步,这意味着我的内存使用量正在上升。

我认为其中很大一部分与绘制实际的 dataGridView 有关。我对 dataGridView 做了一些微调,希望它能提高性能。 (例如禁用自动调整大小、特殊样式等)

在最近的添加中,我添加了行的着色,这是必需的。目前我的应用程序工作如下:

  1. 我从外部系统接收数据
  2. 我通过线程将数据放入队列(ConcurrencyQueue)
  3. 另一个线程从该队列获取数据,对其进行处理并将其添加到绑定(bind)到表的 BindingList。

实际的添加发生在一个有两个参数的函数中:1. 包含列项目的列表(items)2. 行的颜色。(颜色)

看起来如下(半伪):

/* Store the color for the row in the color list so it is accessible from the event */  

rowColors.Add(rowColor); //Class variable that stored the colors of the rows used in the DataGridCellFormatting event

/* Create the row that is to be added. */
ResultRow resultRow = new ResultRow();

foreach(item in items)
{
resultRow.Set(item); /* It's actually a dictionary because some fields are optional, hence this instead of a direct constructor call) */
}

bindingList.Add(resultRow);

/* Row coloring based on error is done in the OnCellFormatting() */


/* Auto scroll down */
if (dataGrid.Rows.Count > 0)
{
dataGrid.FirstDisplayedScrollingRowIndex = dataGrid.Rows.Count - 1;
}

如上面的代码所示,我收到的颜色被添加到一个列表中,该列表在 datagridview 的事件中使用,如下所示:

void DataGridCellFormattingEvent(object sender, DataGridViewCellFormattingEventArgs e)
{
// done by column so it happens once per row
if (e.ColumnIndex == dataGrid.Columns["Errors"].Index)
{
dataGrid.Rows[e.RowIndex].DefaultCellStyle.BackColor = rowColors[e.RowIndex];
}
}

BindingList定义如下:

绑定(bind)列表绑定(bind)列表;

其中 ResultRow 是一个具有如下结构的类:

public class ResultRow
{
private int first = 0;
private string second = "";
private UInt64 third = 0;
private IPAddress fourth = null;
//etc

public ResultRow()
{
}

public void Set (<the values>) //In actuallity a KeyValuePair
{
//field gets set here
}

public UInt64 Third
{
get { return third; }
set { third = value; }
}

/* etc. */

我可以做一些相对简单的事情来提高性能吗?我正在考虑在处理繁忙时禁用数据网格的绘制并在完成时绘制。 (虽然不是首选)另一件事可能是更新频率较低,而不是在每个收到的项目之后。 (BindingList 似乎会在添加内容时自动更新 DataGridView)

我希望有人愿意/能够提供帮助。

-编辑-

表单的响应性,因为当它以上述方式处理数据时,尤其是在一段时间后,它也很糟糕。 (即使上述过程发生在 backgroundworker(s) 和后台线程中)

最佳答案

由于网格中的行数过多,性能可能会在一段时间后下降。你应该给Virtual Mode一试。

但首先,尝试延迟网格的更新并批量添加新条目,即降低更新频率。因此,在每次批量更新之前:

// stop raising update events
bindingList.RaiseListChangedEvents = false;

之后:

// restore update events, raise reset event
bindingList.RaiseListChangedEvents = true;
bindingList.ResetBindings()

在最后一行之后继续滚动到最后一行。

关于c# - DataGridView 性能与 BindingList 数据源相结合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10494757/

24 4 0