外部システムから受信したデータを表示する必要があるアプリケーションを構築しています。このデータは非常に早く到着することができ、一方、各行が占めるバイト数は比較的少ない。つまり、時間単位ごとに多くの行を追加する必要があります。私は現在、自分のメモリ使用量が上がっていることを意味することができるよりも速くデータを受け取っているように見えています。DataGridViewのパフォーマンスとBindingListデータソースの組み合わせ
私は実際のdataGridViewを描画することと関係があると思います。私はdataGridViewをあまり微調整していないので、すでにパフォーマンスが向上しているはずです。 (自動サイズや特殊スタイルなどを無効にするなど)
最近追加されたばかりの行の色付けが追加されました。次のように現在、私のアプリケーションは動作します:
- 私は外部のシステム
- からデータを受信し、私は別のスレッドは、そのキューからデータを取得し、それを処理し、スレッド
- によってキュー(ConcurrencyQueue)にデータを配置しますテーブルにバインドされているBindingListに追加します。
追加実際には2つのパラメータ持つ関数で起こる: 1列のアイテムを含むリスト(アイテム) 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;
}
iは受信色上記のコードに見られるように、以下のようにの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は次のように定義されています。
BindingList bindingList; 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を更新するようです)
誰かが喜んで助けてくれることを願っています。
-edit-
形式の応答ので、非常に悪いだけでなく、それは特にいくつかの時間後に、上記の方法でデータを処理していたとき。 (上記のプロセスはバックグラウンドワーカーとバックグラウンドスレッドで行われますが)
私はデータグリッドにサスペンド/レジューム機構を適用しました。最初はあまり役に立たなかった。私はかなり長い間隔でDataGridを更新する新しいバックグラウンド作業者を作成しました。 (しかし、もっと多くのスレッドや呼び出しがありますが、これが良いことなのかどうかはわかりません。)実際にデータを読み込む前に、実際にその記事を読み込んでいたので、かなり複雑に思えました。この例はデータベースベースなので、直接適用することはできません。しかし、私はパフォーマンスのさらなる向上のためにそれを理解しようとしなければならないと思う。 – Arnold4107176
喜んで助けてください。 msdnチュートリアルが常に最も役に立つとは限りません。 http://www.codeproject.com/Articles/23937/Paging-Data-with-DataGridView-in-VirtualModeは優れたリソースであり、これまでにないベストプラクティスの記事がレイアウトされていますが、正しい情報が含まれている必要があります。仮想化は比較的簡単です。CellValueNeededを使用してデータオブジェクトのプロパティをグリッドに提供する努力を怠ると、すぐに起動して実行できます。 –
それはかなり理解できるようです。私はそれが動作するようにいくつかの情報が不足している記事を感じる。私は現時点でそれを実装しましたが、私のDataGridは空のままです。私はここに私の問題の詳細を掲載している:http://stackoverflow.com/questions/10512981/datagridview-virtual-mode-with-a-simple-list-as-a-source – Arnold4107176