C# 有一个带按钮的主窗体,然后想在新窗体中启动BackgroundWorker,当按钮被单击时?对于再次出现的混乱,我感到非常抱歉。我有一个包含很多其他代码的主窗体。最初,用户以xml格式从数据库API调用数据,然后给出一些不同的条件来处理数据,最后,当他/她

C# 有一个带按钮的主窗体,然后想在新窗体中启动BackgroundWorker,当按钮被单击时?对于再次出现的混乱,我感到非常抱歉。我有一个包含很多其他代码的主窗体。最初,用户以xml格式从数据库API调用数据,然后给出一些不同的条件来处理数据,最后,当他/她,c#,.net,winforms,C#,.net,Winforms,有一个带按钮的主窗体,然后想在新窗体中启动BackgroundWorker,当按钮被单击时?对于再次出现的混乱,我感到非常抱歉。我有一个包含很多其他代码的主窗体。最初,用户以xml格式从数据库API调用数据,然后给出一些不同的条件来处理数据,最后,当他/她单击create按钮时,调用一个符合用户条件的所需方法。在这里,我只需要显示该方法的进度,单击按钮后将调用该方法。无需道歉。我将根据更新更新我的答案:-)非常感谢您的帮助。在这两者之间,我将试着玩它,试着学习更多和一些新的东西。每当我遇到问题时


有一个带按钮的主窗体,然后想在新窗体中启动BackgroundWorker,当按钮被单击时?对于再次出现的混乱,我感到非常抱歉。我有一个包含很多其他代码的主窗体。最初,用户以xml格式从数据库API调用数据,然后给出一些不同的条件来处理数据,最后,当他/她单击create按钮时,调用一个符合用户条件的所需方法。在这里,我只需要显示该方法的进度,单击按钮后将调用该方法。无需道歉。我将根据更新更新我的答案:-)非常感谢您的帮助。在这两者之间,我将试着玩它,试着学习更多和一些新的东西。每当我遇到问题时,这是一种学习新东西的奇妙感觉。它非常有效。谢谢你这么好的方法。我只是在调用它的地方加了一部分。如下<代码>动作动作=()=>xmlconvert_1()
RunWithMargueProgress(操作,toolStripProgressBar)它工作得很好。谢谢你这么好的方法。我只是在调用它的地方加了一部分。如下<代码>动作动作=()=>xmlconvert_1()
RunWithMargueProgress(操作,toolStripProgressBar)
Task.Factory.StartNew(() => 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();
      }
}
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;
    }
}
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());            
    }
}
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);          
}