C#Parallel For循环完成时并不总是退出[间歇性错误]

时间:2018-04-26 11:41:07

标签: c# parallel-processing progress-bar parallel-for

所以我有一个并行for循环,它可以完全独立工作,基本上它循环通过一个32000项集合并进行一些解析和数学运算,并输出预期的结果。

这需要足够长的时间来装载一个加载条,所以我在调用此方法之前创建了一个新表单并初始化它,然后在每个循环完成后简单地将1添加到进度条,它工作正常,它会更新。然后在循环完成后,意味着加载下一个用于显示数据的表单,一切都很顺利。

现在奇怪的问题是,当我删除单行以更新进度条(靠近代码末尾)时,此方法将始终完美,但是当我将其保留时,它有时会按照我的要求工作,有时它将执行所有处理并将正常更新进度条,然后到达结束并停止,它实际上不会退出循环并继续使用代码(我可以告诉因为Debug.WriteLine只是它被卡住时不会触发它。而且我知道程序没有做任何事情,因为CPU处于空闲状态(当循环工作时它处于100%时)并且我无法弄清楚什么是错误的。

这是我的代码:

public void ProcessData()
    {
        try
        {               
            Globals.frmref.pgbProgress.Value = 0;
            string TimeZone = cmbTimeZone.Text;
            Globals.frmref.pgbProgress.Maximum = Globals.FileLength - 8;

            Parallel.For(0, Globals.FileLength - 9, i =>
            {
                Globals.data[i].TimeTemp = "{0}/{1}/20{2} {3}:{4}:{5}";

                //Process the time and date (received in utc as ddmmyy and HHmmss.fff) to dd/mm/yy HH:mm:ss.fff
                Globals.data[i].TimeTemp = String.Format(Globals.data[i].TimeTemp, Globals.data[i].DateRAW.Substring(0, 2), Globals.data[i].DateRAW.Substring(2, 2), Globals.data[i].DateRAW.Substring(4, 2), Globals.data[i].Hours, Globals.data[i].Minutes, Globals.data[i].Seconds);
                Globals.data[i].Time = DateTime.Parse(Globals.data[i].TimeTemp.Split('.')[0], CultureInfo.CreateSpecificCulture("en-AU"));
                Globals.data[i].Time = Globals.data[i].Time.AddMilliseconds(Double.Parse(Globals.data[i].TimeTemp.Split('.')[1]));
                if (TimeZone.Contains("-"))
                {
                    Globals.data[i].Time = Globals.data[i].Time - TimeSpan.Parse(TimeZone.Substring(1, TimeZone.Length - 1));
                }
                else
                {
                    Globals.data[i].Time = Globals.data[i].Time + TimeSpan.Parse(TimeZone.Substring(1, TimeZone.Length - 1));
                }

                //Process the lat and lon input to Decimal Degrees
                Globals.data[i].DDLat = Globals.data[i].LatDegrees + (Globals.data[i].LatMinutes / 60) + (Globals.data[i].LatSeconds / 3600);
                Globals.data[i].DDLon = Globals.data[i].LonDegrees + (Globals.data[i].LonMinutes / 60) + (Globals.data[i].LonSeconds / 3600);

                if (Globals.data[i].NS == 'S')                          //North/South designator
                {
                //Make the dd coord negative if its southern
                Globals.data[i].DDLat = Globals.data[i].DDLat * -1;
                }
                if (Globals.data[i].EW == 'W')                          //East/West Designator
                {
                //ditto
                Globals.data[i].DDLon = Globals.data[i].DDLon * -1;
                }
                //***This is the line breaks it sometimes***
                Globals.frmref.pgbProgress.Invoke(new Action(() => Globals.frmref.pgbProgress.Value++)); 
            });
            Debug.WriteLine("Made it");
            Globals.frmref.Close();
        }
        catch (Exception ex)
        {
            MessageBox.Show("An unexpected error has occurred, email wmatt1672@gmail.com with details of the error.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            MessageBox.Show(ex.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            Application.Exit();
        }
    }

我尝试在更新之前锁定ProgressBar控件,使用int存储值,然后通过另一种方法更新进度条,并使用Task.Factory(奇怪地运行代码)。我完全没有想法。

tldr:并行for循环有时在完成后才会退出,只有当我添加一行代码才能将1添加到进度条时。

0 个答案:

没有答案