3

私は現在、SQL データベースにアクセスし、いくつかのデータ (約 10000 項目) を取得し、アプリケーションで使用している WPF チャートのデータとして使用されるデータ ポイントのコレクションを更新する必要がある C#/WPF でシステムを開発しています。 (誰かが疑問に思っている場合に備えて、Visifire チャート作成ソリューション)。

私が単純なシングル スレッド ソリューションを作成したとき、ご想像のとおり、アプリケーションがデータベースにクエリを実行し、データを取得し、チャートをレンダリングするまでの間、システムはハングアップしました。ただし、マルチスレッドを使用してデータがフェッチおよび処理されている間、待機アニメーションをユーザーに追加することで、このタスクをより迅速に行いたいと考えました。ただし、次の 2 つの問題が発生します。

  1. マルチスレッドを使用している場合、コレクションの更新と同期の維持に問題があります。授業に慣れていDispatcherないので、どうしたらよいかわかりません。
  2. 私は明らかにマルチスレッドをうまく処理していないため、待機アニメーションは表示されません (UI がフリーズしているため)。

コレクションにマルチスレッドを効果的に使用する良い方法があるかどうかを調べようとしています。Microsoft にはThread-Safe コレクションがあることがわかりましたが、私のニーズに合うものはないようです。

また、誰かが学び、理解するための良い参考文献を持っているなら、Dispatcher私はそれを高く評価します.

編集:これは私がやろうとしていることのコードスニペットです。おそらく、私の質問にさらに光を当てることができます:

private List<DataPoint> InitializeDataSeries(RecentlyPrintedItemViewModel item)
{
    var localDataPoints = new List<DataPoint>();

    // Stopping condition for recursion - if we've hit a childless (roll) item
    if (item.Children.Count == 0)
    {
        // Populate DataPoints and return it as one DataSeries
        _dataPoints.AddRange(InitializeDataPoints(item));
    }
    else
    {
        // Iterate through all children and activate this function on them (recursion)
        var datapointsCollection = new List<DataPoint>();
        Parallel.ForEach(item.Children, child => datapointsCollection = (InitializeDataSeries((RecentlyPrintedItemViewModel)child)));

        foreach (var child in item.Children)
        {    
            localDataPoints.AddRange(InitializeDataSeries((RecentlyPrintedItemViewModel)child));
        }
    }

    RaisePropertyChanged("DataPoints");
    AreDataPointsInitialized = true;

    return localDataPoints;
}

ありがとう

4

1 に答える 1