2

我在后台使用 xml 数据创建一些文件

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

现在,问题是如何使用带有一些消息和进度的 StatusStrip 控件或至少只是进度的滚动动画来显示此方法的进度。我不知道它是如何工作的。

更新:首先,这个方法'xmlconvert(xx,yy)'有四种不同的形式,取决于用户在运行时选择的条件。在我的应用程序的主窗体中,用户可以从不同的条件中选择对数据进行处理。最后,当用户单击“创建”按钮时,所有这些条件都将被检查,并且将在该按钮单击事件中调用合适的方法。我需要显示在运行时调用的此方法的进度。

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();
      }
}

我想显示将在运行时调用的这些方法之一的进度取决于条件。

非常感谢。

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());            
    }
}

WhereProgressForm将是一个简单的表单ProgressBar,即设置为Marquee样式。如果您有想法,它是如何进展的,最好为用户和使用显示进度BackgroundWorker

只要它的参数是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 回答