使用后台工作程序从多个路径搜索文件

时间:2013-11-13 16:23:23

标签: c# backgroundworker

我正在开发一个应用程序来搜索使用后台工作程序提供的目录中的文件...问题在于backgroundWorker1.RunWorkerAsync();

以下是我的代码,当我尝试提供多个路径来搜索我在文本框中输入的文件时

private void toolStripTextBox1_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyValue == 13)
    {
        foreach (string s in listBox1.Items)
        {
            DirectoryInfo deer = new DirectoryInfo(s);
            toolStripButton2.Visible = true;
            //listView1.Items.Clear();
            if (!backgroundWorker1.IsBusy)
            {
                backgroundWorker1.RunWorkerAsync(deer);
            }
            else
                MessageBox.Show("Can't run the worker twice!");
            // backgroundWorker1.RunWorkerAsync(deer);
        }
    }
    listView1.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize);
    listView1.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent);
}

我收到以下错误

此BackgroundWorker当前正忙,无法同时运行多个任务。 请帮帮我..

2 个答案:

答案 0 :(得分:0)

答案 1 :(得分:0)

不确定您在此尝试实现的目标。

1)如果您希望在不同的线程上同时运行多个任务(即处理listBox1.Items中的每个项目),您将必须创建单独的线程或任务来执行此操作,而不是使用同一个背景工作者。

2)如果您只是希望在后台处理这些项目的整体处理而不影响(阻止)UI,则需要使用一个后台工作程序并将其传递给整个集合。

在任何情况下,当前代码都不应抛出错误,除非您注释掉mbox并取消注释另一个backgroundWorker1.RunWorkerAsync(deer);。如果你这样做,那么你基本上是在完成它之前的工作之前尝试启动相同的线程。如果你不这样做,你基本上不会跳过列表中的项目,直到线程再次可用。

第一个的一般例子应如下所示:

foreach (string s in listBox1.Items)
{
    DirectoryInfo deer = new DirectoryInfo(s);
    toolStripButton2.Visible = true;            
    Task.Run(() => TheDoWorkMethodYouUsed(deer);
}

第二个的一般示例是修改do work方法以遍历整个集合,并传递该集合:

if (e.KeyValue == 13)
{
    backgroundWorker1.RunWorkerAsync(listBox1.Items);        
}

在DoWork方法中:

foreach (string s in passedList)
{
    DirectoryInfo deer = new DirectoryInfo(s);
    // continue with normal processing of the method
}