【问题标题】:BackgroundWorker is currently busy and can not run multiple tasks concurrentlyBackgroundWorker 当前很忙,无法同时运行多个任务
【发布时间】:2015-04-22 21:10:40
【问题描述】:

我在使用后台工作程序时尝试迭代一个数组,我确信这只是我的语法不正确,但我不断收到错误。有人可以帮我解决这个问题吗?

namespace Form1
{
public partial class Form1 : Form
{
    public BackgroundWorker backgroundWorker1 = new BackgroundWorker();
    public OpenFileDialog fd = new OpenFileDialog();

    public Form1()
    {
        InitializeComponent();
        backgroundWorker1.WorkerReportsProgress = true;
        backgroundWorker1.WorkerSupportsCancellation = true;
        backgroundWorker1.DoWork += new DoWorkEventHandler(backgroundWorker1_DoWork);
        backgroundWorker1.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker1_ProgressChanged);
    }
    private void btn_Two_Click(object sender, EventArgs e)
    {
        fd.Title = "Select The Text File To Open";
        fd.Filter = "Text Files|*.txt";
        fd.InitialDirectory = @"C:\";
        if (fd.ShowDialog() == DialogResult.OK)
        {
            TextFiles(sender);
        }
    }
    private void TextFiles(object sender)
    {
        IEnumerable<String> employeeNames = File.ReadLines(fd.FileName);
        foreach (string pgs in employeeNames)
        {
            employee = pgs;
            ProcessTables(employee, sender);
        }
    }
    private void ProcessTables(string employee, object sender)
    {
        sw.Restart();
        timer.Start();
        //This line is where the compiler throws the error
        backgroundWorker1.RunWorkerAsync();            
    }
    private void backgroundworker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
      progressBar1.Value = e.ProgressPercentage;
    }
    private void backgroundworker1_DoWork(object sender, DoWorkEventArgs e)
    {
      //Never hits this block so I will omit this code for time sake
    }
}
}

【问题讨论】:

  • 你的后台工作事件方法在哪里?
  • @Lloyd -- 查看编辑。我的代码实际上并没有达到这些方法,它命中了 RunWorkerAsync() 并抛出了错误
  • 您在 foreach 循环中多次调用同一个后台工作程序。您可以创建多个后台工作人员(这将是一团糟)或使用多线程,如果您想同时处理文件,这将是解决此问题的正确方法。
  • 查看这篇文章,了解如何为每个循环编写一个简单的并行:msdn.microsoft.com/en-us/library/dd460720%28v=vs.110%29.aspx

标签: c# backgroundworker


【解决方案1】:

ProcessTablesTextFiles 循环调用。因此,您正在尝试重新启动正在运行的BackgroundWorker

如何解决这个问题,取决于您实际尝试做什么(您可以为单个 BackgroundWorker 准备一个“待办事项列表”,使用多个 BackgroundWorkers,使用生产者/消费者模式)。

【讨论】:

  • 我正在尝试在调用后台工作人员之前准备一个待办​​事项列表。我将如何重写以只调用一次后台工作人员?
  • 好吧,在循环之后调用 RunWorkAsync - 将所有员工放在一个列表中,然后将此列表交给DoWork(参见 MSDN 中的方法重载)。
【解决方案2】:

您可能通过单击btn_Two 呼叫了两次BackgroundWorker。您应该在 BackgroundWorker 忙碌时禁用按钮。

private void ProcessTables(string employee, object sender)
    {
        sw.Restart();
        timer.Start();
        btn_Two.Enable = false;
        backgroundWorker1.RunWorkerAsync();            
    }

并且您应该在启用按钮的位置添加 backgroundWorker Comleted 事件处理程序。像这样

private void backgroundWorker1_RunWorkerCompleted(
    object sender, RunWorkerCompletedEventArgs e)
{
    btn_Two.Enable = true;
}

【讨论】:

  • 我认为问题在于它点击 TextFiles 方法然后转到 ProcessTables,但如果它们是数组中的多个元素,它将尝试多次点击 ProcessTables 从而尝试多次调用 backgroundworker .
  • 是的,看起来像。但是以任何方式禁用您的按钮;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多