1

我正在开发一个应用程序,该应用程序搜索使用后台工作人员提供的目录中的文件......问题出在 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 当前很忙,无法同时运行多个任务。请帮帮我..

4

2 回答 2

1

不确定您要在这里实现什么。

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
}
于 2018-04-24T13:55:12.400 回答
0

使用多个线程:

创建多个线程并等待所有线程完成

或者

http://msdn.microsoft.com/en-us/library/ff649143.aspx

于 2013-11-13T16:58:03.970 回答