Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# BackgroundWorker当前正忙,无法同时运行多个任务_C#_Backgroundworker - Fatal编程技术网

C# BackgroundWorker当前正忙,无法同时运行多个任务

C# BackgroundWorker当前正忙,无法同时运行多个任务,c#,backgroundworker,C#,Backgroundworker,我试图在使用backgroundworker时迭代一个数组,我确信这只是因为我的语法不正确,但我经常会遇到错误。有人能帮我做些什么来纠正这个问题吗 namespace Form1 { public partial class Form1 : Form { public BackgroundWorker backgroundWorker1 = new BackgroundWorker(); public OpenFileDialog fd = new OpenFileDialog(

我试图在使用backgroundworker时迭代一个数组,我确信这只是因为我的语法不正确,但我经常会遇到错误。有人能帮我做些什么来纠正这个问题吗

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
    }
}
}
namespace Form1
{
公共部分类Form1:Form
{
public BackgroundWorker backgroundWorker1=新的BackgroundWorker();
public OpenFileDialog fd=新建OpenFileDialog();
公共表格1()
{
初始化组件();
backgroundWorker1.WorkerReportsProgress=true;
backgroundWorker1.WorkerSupportsScanCellation=true;
backgroundWorker1.DoWork+=新的DoWorkerVenthandler(backgroundWorker1_DoWork);
backgroundWorker1.ProgressChanged+=新的ProgressChangedEventHandler(backgroundWorker1\u ProgressChanged);
}
私有无效btn\u两次单击(对象发送者,事件参数e)
{
fd.Title=“选择要打开的文本文件”;
fd.Filter=“文本文件|*.txt”;
fd.InitialDirectory=@“C:\”;
如果(fd.ShowDialog()==DialogResult.OK)
{
文本文件(发送方);
}
}
私有void文本文件(对象发送方)
{
IEnumerable employeeNames=File.ReadLines(fd.FileName);
foreach(employeeNames中的字符串pgs)
{
员工=pgs;
ProcessTables(员工、发件人);
}
}
私有void ProcessTables(字符串employee、对象发送者)
{
sw.Restart();
timer.Start();
//这一行是编译器抛出错误的地方
backgroundWorker1.RunWorkerAsync();
}
私有void backgroundworker1\u ProgressChanged(对象发送方,ProgressChangedEventArgs e)
{
progressBar1.值=e.ProgressPercentage;
}
私有void backgroundworker1\u DoWork(对象发送方,DoWorkEventArgs e)
{
//从不点击此块,因此为了时间起见,我将省略此代码
}
}
}

通过单击
btn\u 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;
}

通过单击
btn\u 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
。因此,您正在尝试重新启动正在运行的
BackgroundWorker


如何解决这个问题,取决于您实际要做的事情(您可以为单个
后台工作人员
准备一个“待办事项列表”,使用多个
后台工作人员
s,使用生产者/消费者模式)。

ProcessTables
在循环中由
文本文件
调用。因此,您正在尝试重新启动正在运行的
BackgroundWorker


如何解决这个问题,取决于您实际要做的事情(您可以为单个
后台工作人员
准备一份“待办事项列表”,使用多个
后台工作人员
,使用生产者/消费者模式)。

您的后台工作人员事件方法在哪里?@Lloyd--请参阅编辑。我的代码实际上并没有到达这些方法,它命中RunWorkerAsync()并在foreach循环中抛出您多次调用同一backgrounder worker的错误。如果要同时处理文件,可以创建多个后台工作程序(这会很混乱)或使用多线程,这是解决此问题的正确方法。请参阅本文,了解如何为每个循环编写简单的并行程序:后台工作程序事件方法在哪里?@Lloyd--请参阅编辑。我的代码实际上并没有到达这些方法,它命中RunWorkerAsync()并在foreach循环中抛出您多次调用同一backgrounder worker的错误。如果您想同时处理文件,可以创建多个后台工作程序(这将是一个混乱)或使用多线程,这将是解决此问题的正确方法。请参阅这篇关于如何为每个循环编写简单并行程序的文章:我认为问题在于它会命中TextFiles方法,然后转到ProcessTables,但是如果它们是数组中的多个元素,它将尝试多次命中ProcessTables,从而尝试多次调用backgroundworker。但无论如何都要禁用按钮;)我认为问题是它点击TextFiles方法然后进入ProcessTables,但是如果它们是数组中的多个元素,它将尝试多次点击ProcessTables,从而尝试多次调用backgroundworker。是的,看起来像。但无论如何都要禁用按钮;)在给后台工作人员打电话之前,我正在准备一份待办事项清单。如何重新编写以只调用backgroundworker一次?好吧,在循环后调用RunWorkAsync-将所有员工放入一个列表中,并将此列表交给
DoWork
(请参阅MSDN中的方法重载)。我正在尝试在调用后台工作人员之前准备一个待办事项列表。如何重新编写以只调用backgroundworker一次?好的,在循环后调用RunWorkAsync-将所有员工放入一个列表中,并将此列表交给
DoWork
(请参阅MSDN中的方法重载)。