C# BackgroundWorker当前正忙,无法同时运行多个任务
我试图在使用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(
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();
}
您应该在启用按钮的位置添加backgroundWorkerComleted
事件处理程序。像这样
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();
}
您应该在启用按钮的位置添加backgroundWorkerComleted
事件处理程序。像这样
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中的方法重载)。