0

プログレス バー マーキーを使用して新しいフォームを表示したいと考えています。呼び出されるアクションが大きすぎて、UI が同じスレッド上にある場合、進行状況バーを更新しないため、このフォームは別のスレッド上にある必要があります。

新しいスレッドを呼び出し、フォームを作成しましたが、表示されるとすぐにフォームが閉じます...

ここに私のメインからの私のコードがあります:

    frmProgress f = new frmProgress();
    Thread t = new Thread(new ThreadStart(delegate() { f.Show(); }));
    t.Start();
    documentManager.Compile(); //This is my big action
    t.Abort();

フォームのコードは次のとおりです。

    public frmProgress()
    {
        InitializeComponent();
    }

何を間違えたのか知りたいです。

ありがとう!

4

1 に答える 1

3

いくつかの問題があります。

  1. 非 UI スレッドでフォームを表示しています。これは問題を引き起こすだけです。UI スレッドにある必要があります。
  2. UI スレッドで実行時間の長いタスクを実行しています。これにより、UI の更新がブロックされています。

UI スレッドでフォーラムを表示し、長時間実行されるタスクをバックグラウンド スレッドで実行する必要があります。

ここでの作業に最適なツールは、BackgroundWorker. UI/非 UI スレッドで適切なコードが実行されていることを確認するために、多くの作業が行われます。新しいタスクを作成し、BackgroundWorker実行時間の長いタスクをDoWorkイベントに配置します。BGW を開始する前に必要な簡単な UI の更新 (フォームを表示) を行い、Completedイベントでクリーンアップを行います (UI で実行されます)。BackgroundWorkerのMSDN ページには、いくつかの優れたがあります。

を使用するもう 1 つの利点はBackgroundWorker、単にマーキー バーを表示するのではなく、進捗状況を簡単に報告できることです (達成率を知る良い方法がある場合)。イベント ハンドラーにハンドラーを追加ProgressReportedしてプログレス バーを更新し、ReportProgress作業中に定期的にメソッドを呼び出すだけです。正確なコード スニペットについては、リンクされた例を参照してください。

于 2012-07-25T18:03:24.360 に答える