DataGridView-Leistung in Kombination mit einer BindingList datasource

Ich Baue eine Anwendung, die zur Anzeige von empfangenen Daten aus einem externen system. Diese Daten können sehr schnell, während die Menge von bytes jede Zeile nimmt, ist relativ klein. Dies bedeutet, dass eine Menge von Zeilen, die Hinzugefügt werden müssen, die pro Zeiteinheit. Ich bin derzeit an einem Punkt, wo es scheint, ich empfangen Sie Daten schneller, als ich verarbeiten kann was bedeutet meine Speicherauslastung steigt.

Ich denke, ein großer Teil dieser hat zu tun mit der Zeichnung der tatsächlichen dataGridView. Ich habe wenig getan, tweaks, um das dataGridView-in der Hoffnung, es würde die Leistung erhöhen bereits. (z.B. deaktivieren von " auto-Größe, Besondere Stile, etc.)

In eine neue Ergänzung, die ich Hinzugefügt Färbung der Zeilen, die erforderlich war. Derzeit meine Anwendung funktioniert wie folgt:

  1. Ich Daten aus dem externen system
  2. Stelle ich die Daten in eine Warteschlange (ConcurrencyQueue) von einem thread
  3. Einem anderen thread bezieht Daten aus, die queue, verarbeitet diese und fügt Sie zu der BindingList, dass der table gebunden ist.

Den tatsächlichen hinzufügen geschieht in einer Funktion mit 2 Parametern:
1. Eine Liste mit den Positionen für die Spalten (items)
2. Eine Farbe für die Zeile.(Farbe)

sieht es wie folgt aus (semi-pseudo):

/* 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;
}

Wie man im obigen code die Farbe, die ich erhalten einer Liste Hinzugefügt, die in ein Ereignis des datagridview wie folgt:

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];
}
} 

Die BindingList ist wie folgt definiert:

BindingList bindingList;

wo ResultRow ist eine Klasse mit einer Struktur wie dieser:

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. */

Sind es relativ einfache Dinge, die ich tun kann, um die Leistung zu erhöhen? Ich dachte eventuell deaktivieren Zeichnung des datagrid-während der Verarbeitung beschäftigt ist und ziehen, wenn es fertig ist. (obwohl nicht bevorzugt) eine Andere Sache ist ggf. aktualisiert weniger Häufig statt nach jedem Einzelteil. (BindingList scheint für die automatische Aktualisierung des DataGridView, wenn etwas Hinzugefügt wird, es aber)

Ich hoffe jemand ist bereit/in der Lage zu helfen.

-Bearbeiten-

Die Reaktionsfähigkeit der form wegen, ziemlich schlecht, wenn es die Verarbeitung von Daten in der zuvor beschriebenen Art und Weise, vor allem nach einiger Zeit. (auch wenn der obige Prozess findet in der backgroundworker-Klasse(N) und hintergrund-threads)

Schreibe einen Kommentar