Windows Formsネジやイベント-ListBoxの更新が速やかにprogressbarの経験に大きな遅延

StackOverflow https://stackoverflow.com/questions/12095

質問

当チームは新規採用のワークフローシステムへの置き換えます。って将移行の古いデータのスキーマ.決定していないことを小さなWindows Formsプロジェクトとしてのスキーマが根本的に異なっていると直TSQLスクリプトは適切な解決策です。

の封止クラス'ImportControllerうな取り組みを宣言し、以下の委譲のイベント:

public delegate void ImportProgressEventHandler(object sender, ImportProgressEventArgs e);
public static event ImportProgressEventHandler importProgressEvent;

は、メインウィンドウを開始するstaticメソッドがクラスを新しいスレッド:

Thread dataProcessingThread = new Thread(new ParameterizedThreadStart(ImportController.ImportData));
dataProcessingThread.Name = "Data Importer: Data Processing Thread";
dataProcessingThread.Start(settings);

のImportProgressEvent(<%=args%>等:argsをメッセージ文字列には、最大のint値は、進捗バーおよび現在の進捗int値です。Windowsの形subcribesのイベント:

ImportController.importProgressEvent += new ImportController.ImportProgressEventHandler(ImportController_importProgressEvent);

への応対を行っておりますが、このように利用でdelegate:

    private delegate void TaskCompletedUIDelegate(string completedTask, int currentProgress, int progressMax);

private void ImportController_importProgressEvent(object sender, ImportProgressEventArgs e)
            {
                this.Invoke(new TaskCompletedUIDelegate(this.DisplayCompletedTask), e.CompletedTask, e.CurrentProgress, e.ProgressMax);
            }

最後に、進捗バーおよびlistboxを更新しました:

private void DisplayCompletedTask(string completedTask, int currentProgress, int progressMax)
        {
            string[] items = completedTask.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);

            foreach (string item in items)
            {
                this.lstTasks.Items.Add(item);
            }

            if (currentProgress >= 0 && progressMax > 0 && currentProgress <= progressMax)
            {
                this.ImportProgressBar.Maximum = progressMax;
                this.ImportProgressBar.Value = currentProgress;
            }
        }

このことが、ListBoxのように更新するのがとても早かったり、その進捗バーにな動きまでバッチほぼ完了。??を与えることで発生する?

役に立ちましたか?

解決 4

@ジョン

のリンクです。

@ま

が得らthreadpoolingとしていま々と産卵の一つ。のスレッドは純粋についての対応UIをSQLサーバーはノとを読み込みおよび書き込みます.あな短寿命の糸についています。

に関するレッジ-ハンマーそうかもしれません。しかしなが私の問題と画面の椅子です。いるunusalバッチデータの多くに多くの外部キーの記録をバッチで起こる早期の過程におけcurrentProgressん++'dのための良い10秒に短縮されました。

することができます。

たくさんの入力、もっと考え方をしていると他のコードを、だから私の瞬間を謙虚に私のことを証明しているエラーは通常、人:)

他のヒント

も体験してみましょうBackgroundWorkerます。でスレッドに簡単です。例:

その対象外となり、時にはその便利な Application.DoEvents(); のgui部品に反応し、ユーザの入力などを押しない場合はキャンセルボタン、ステータスバーダイアログを表示します。

いくらいはWindows Vistaでは動作しないのですか?にのっと同じものを一部作品の関連アプリケーションでした。なんだかというの遅延の場合に、進捗バー"版".

せていただきましたUIのスレッドが自由に走行中のすべてのことですか?すなわちで座ってなブップに参加その他の待つのでしょうか?そのように見えます。

ご提案の利用BackgroundWorkerはいつも優れているとレッジ-ハンマーを出の問題の解決を図る必要がある荷重のリフレッシュ/更新されます。

とBackgroundWorker用プールのスレッドは、親方の行動をよりのお寿命の短いねじになります。

が得らthreadpoolingとして ただ、それだけ初産卵を一 thread.のスレッドは、純粋に ついての対応UIをSQL サーバがノとを読み込み、 書き込みます.あな短 住ます。

OK、ありがとうございま、嬉しいたバグがご覧になったBackgroundWorker?なかやっているが、標準化されたファッション(なくご自身の代表)、なしを作成する必要が新しいスレッドのもとの小さいものの、いまだに有)利点があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top