データグリッドビューでデータ(1,200,000行)をロードしています。アプリケーションの読み込みに時間がかかり、時折フリーズすることがあります。データグリッドにデータを非同期でロードする
非同期にロードする方法がわかりません。 (progressBarの場合があります)。
私はここでいくつかの助けを見つけることができますか?
データグリッドビューでデータ(1,200,000行)をロードしています。アプリケーションの読み込みに時間がかかり、時折フリーズすることがあります。データグリッドにデータを非同期でロードする
非同期にロードする方法がわかりません。 (progressBarの場合があります)。
私はここでいくつかの助けを見つけることができますか?
データを小さなチャンクに分割します(一度に100〜1000行など)。 WPFグリッドがデータコレクションにバインドされていて、コレクションが可観測コレクション(INotifyCollectionChangedを実装)である場合、WPFは新しいデータがコレクションに追加されると自動的に表示を更新します。
仮想化リストコントロールまたはグリッドをページングデータソースと組み合わせて使用することも検討してください。現在、画面に表示されているデータのみが(メモリに120万行のデータではなく)ロードされます。これはあなたのための "チャンク"を実行し、あなたは非常にわずかなメモリ使用やネットワークの遅れで無限の量のデータをユーザに提示することができます。
は、仮想リストボックスのための非同期データを取得する上で、このSOの記事をチェックアウト:How do I populate a ListView in virtual mode asynchronously?
私はスレッドを使用して非常によく似た何かをやっているアプリケーションがあります。このコードは、コードビハインドの実行中にDataGridを一度に1行ずつ更新する必要があります。
using System.Windows.Threading;
private void Run()
{
try
{
var t = new Thread(Read) { IsBackground = true };
t.Start();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
private void Read()
{
foreach (/* whatever you are looping through */)
{
/* I recommend creating a class for the result use that for the
datagrid filling. */
var sr = new ResultClass()
/* do all you code to generate your results */
Dispatcher.BeginInvoke(DispatcherPriority.Normal,
(ThreadStart)(() => dgResults.AddItem(sr)));
}
}