2

バックグラウンドでxmlデータからいくつかのファイルを作成しています

Task.Factory.StartNew(() => xmlconvert(xx, yy));

ここで問題は、StatusStrip コントロールを使用して、メッセージと進行状況、または少なくとも進行状況のスクロール アニメーションを使用して、このメソッドの進行状況を表示する方法です。それがどのように機能するのか、私にはまったくわかりません。

更新: まず、このメソッド 'xmlconvert(xx, yy)' には、実行時にユーザーが選択した条件に応じて 4 つの異なる形式があります。私のアプリケーションのメインフォームでは、ユーザーはさまざまな条件から選択してデータを処理できます。最後に、ユーザーが「作成」ボタンをクリックすると、これらすべての条件がチェックされ、そのボタン クリック イベント内で適切なメソッドが呼び出されます。実行時に呼び出されるこのメソッドの進行状況を表示する必要があります。

private void btnCreateRelease_Click(object sender, EventArgs e)
{
      // Checks set of conditions

      if(cond 1)
      {
          xmlconvert_1();
      }
      else if (cond2)
      {
          xmlconvert_2();
      }
      else if (cond3)
      {
          xmlconvert_3();
      }
      else if (cond4)
      {
          xmlconvert_4();
      }
}

条件に応じて、実行時に呼び出されるこれらのメソッドの 1 つの進行状況を表示したいと考えています。

どうもありがとう。

4

2 に答える 2

3

これには BackgroundWorker を使用できますが、これも非常に簡単です。以下にサンプルを示します。

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();

        backgroundWorker1.WorkerReportsProgress = true;
        backgroundWorker1.DoWork += new DoWorkEventHandler(backgroundWorker1_DoWork);
        backgroundWorker1.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker1_ProgressChanged);
    }

    void Form1_Shown(object sender, EventArgs e)
    {
        backgroundWorker1.RunWorkerAsync();
    }

    void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        // Do your work in here.
        xmlconvert(xx, yy);

        for (int i = 0; i <= 100; i++)
        {
            backgroundWorker1.ReportProgress(i);
            System.Threading.Thread.Sleep(100);
        }
    }

    void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        progressBar1.Value = e.ProgressPercentage;
    }
}

そして、ここにドキュメントへのリンクがあります。

シナリオで機能させるには、進行状況バーを StatusStrip コントロールに追加し、backgroundWorker1_ProgressChangedイベント内から更新することをお勧めします。

于 2012-10-18T12:08:53.637 に答える
1

表示したいだけの場合は、アプリがハングしていないことを次のアプローチに役立てることができます。

public static class ActionExtensions
{
    public static void RunWithMargueProgress(this Action action)
    {           
        var progressForm = new ProgressForm();

        progressForm.Show();
        Task.Factory.StartNew(action)
            .ContinueWith(t =>
                              {
                                  progressForm.Close();
                                  progressForm.Dispose();
                              }, TaskScheduler.FromCurrentSynchronizationContext());            
    }
}

、スタイルに設定されてProgressFormいる単純なフォームはどこにありますか。進行状況がわかれば、ユーザーに進行状況を表示して を使用することをお勧めします。ProgressBarMarqueeBackgroundWorker

パラメータが である限り、Action簡単に再利用できます。

使用法は次のとおりです。

private void button_Click(object sender, EventArgs e)
{
    Action action = () => Thread.Sleep(5000);
    action.RunWithMargueProgress();          
}

アニメーション化するステータス ストリップにコントロールがある場合は、次のように実行できます。

public static void RunWithMargueProgress(this Action action, ToolStripProgressBar progressBar)
{
    progressBar.Style = ProgressBarStyle.Marquee;            
    progressBar.MarqueeAnimationSpeed = 30;

    Task.Factory.StartNew(action)
        .ContinueWith(t =>
                           {
                               progressBar.MarqueeAnimationSpeed = 0;
                               progressBar.Style = ProgressBarStyle.Continuous;                                      
                           }, TaskScheduler.FromCurrentSynchronizationContext());
}

使用法はほとんど同じです。

private void button_Click(object sender, EventArgs e)
{
    Action action = () => Thread.Sleep(5000);
    action.RunWithMargueProgress(ToolStripProgressBar);          
}
于 2012-10-18T12:47:33.240 に答える