c# - BackgroundWorker 和 foreach 循环

标签 c# .net backgroundworker

我必须使用后台工作程序处理一个循环。

在我开始新的循环迭代之前,我需要等到前面的 backgroundworker 完成。

我的 foreach 循环中带有 isbusy 标志的 while 循环对我来说似乎不是一个好主意。

我应该如何设计这个循环,让它在迭代循环之前等待 bg-worker 结束

public void AutoConnect()
{
    string[] HardwareList = new string[] { "d1", "d4", "ds1_2", "ds4_2" };
    foreach (string HW in HardwareList)
    {
        if (backgroundWorker1.IsBusy != true)
        {
            backgroundWorker1.RunWorkerAsync(HW);
            // Wait here until backgroundWorker1 finished
        }
    }
}

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{

    BackgroundWorker worker = sender as BackgroundWorker;
    string FileName = e.Argument as string;
    try
    {
        if ((worker.CancellationPending == true))
        {
            e.Cancel = true;
        }
        else
        {
            // Time consuming operation
            ParseFile(Filename);
        }
    }
    catch { }
}

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    label1.Text = e.ProgressPercentage.ToString() + " lines";
}

private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    if(e.Cancelled == true)
    {
        //this.tbProgress.Text = "Canceled!";
    }
    else if(!(e.Error == null))
    {
        //this.tbProgress.Text = ("Error: " + e.Error.Message);
    }
    else
    {
        label1.text = "Done!";
    }
}

最佳答案

您错误地使用了 backgroundworker。将整个列表传递给后台工作人员并在那里运行 foreach 循环。

public void AutoConnect()
{
    string[] HardwareList = new string[] { "d1", "d4", "ds1_2", "ds4_2" };
    backgroundWorker1.RunWorkerAsync(HardwareList);
}

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{

    BackgroundWorker worker = sender as BackgroundWorker;
    string[] FileNames = e.Argument as string[];
    int i = 0;

    foreach (string FileName in FileNames)
    {
       ParseFile(FileName);
       worker.ReportProgress(++i);
       if (worker.CancellationPending)
       {
          e.Cancel = true;
          break;
       }
    }
}

关于c# - BackgroundWorker 和 foreach 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2716353/

相关文章:

c# - ManualResetEventSlim : Calling . Set() 后跟 .Reset() 不会释放 *任何* 等待线程

c# - 如何比较 C# 中的日期列表?

javascript - 使用 Visual Studio 2010 时禁用 IE9 Javascript 调试器

c# - 如何将程序集 'netstandard, Version=2.0.0.0' 添加到我的 tvOS Xamarin 项目?

c# - 试图简化我们的存储库模式

c# - 如何将字节数组转换为字符串?

.net - WPF 后台 worker 和 ProgressBar

c# - 向后台 worker 发送参数?

c# - 使用Ping映射事件IP的线程问题-C#

c# - 如何使用数据集计算wpf datagrid列的总计