SQLサーバーから大量のデータをロードするフォームがあります。WinAppフォームがLoadイベント中に大量のデータをロードしています
private void BranchCenter_Load(object sender, EventArgs e) {
//Combo boxes:
LoadCities();
LoadCoordinators();
LoadComputerSystems();
//Actual entity
LoadBranch();
}
private void LoadCities() {
//LINQ2SQL to load data. ~5000 records.
}
private void LoadCoordinators() {
//LINQ2SQL to load data. ~50 records.
}
private void LoadComputerSystems() {
//LINQ2SQL to load data. ~550 records.
}
private void LoadBranch() {
LoadBranchInit();
LoadBranchDetails();
LoadBranchTimings();
LoadBranchServices();
LoadBranchLocumsHistory();
LoadBranchJobs();
LoadBranchNotes();
}
private void LoadBranchInit() {
//LINQ2SQL to load the Branch object based upon the Branch ID
}
private void LoadBranchDetails() {
//LINQ2SQL to load basic branch stuff. 38 fields. Mixed editors.
}
private void LoadBranchTimings() {
//LINQ2SQL to load timings info into 80 date-time controls
}
private void LoadBranchServices() {
//LINQ2SQL to load services offered at branch info into 20 check-boxes controls
}
private void LoadBranchLocumsHistory() {
//LINQ2SQL to load branch history info into grid control. Always increasing # of rows :(
}
private void LoadBranchJobs() {
//LINQ2SQL to load branch jobs info into grid control. Always increasing # of rows :(
}
private void LoadBranchNotes() {
//LINQ2SQL to load branch notes info into grid control
}
UIはタブコントロール付きのフォームです。上の各ディテールはタブページに移動します。できるだけ早くフォームをロードしてユーザーに表示する必要があります。フォームが表示されたら、各ページのデータを取得するために一連のバックグラウンドワーカーを起動する必要があります。
私はバックグラウンドワーカーを混乱させようとしていますが、その使い方を理解できません。 「別のスレッドがメインスレッドのコントロールにアクセスしようとしました...またはそのようなもの...」
理想的な状況は、すべてのタブにデータをロードするプログレスバーを持つことです。それぞれのバックグラウンドワーカーが終了すると相互作用可能になる。
どのような戦略やアドバイスですか?読んでいただきありがとうございます。
データは、e.Resultでうまく動作するにはあまりにも多くすぎます...しかし、私は実際に一度戻ってくることができます。 – DoomerDGR8
なぜそれはあまりにもですか?非同期に取得する場合は、GUI以外のスレッドで変数を収集し、UIスレッドを呼び出してUIでデータを更新する必要があります。 BackgroundWorkerは実際にこれを行います。スレッドを使用すると柔軟になることができますが、おそらく問題にはならないでしょう。だから、実際の大規模なデータセットでBackgroundWorkerを試したことが分かりませんが、コンピュータのメモリ容量が大きすぎないと悪いことは起こりません。 –