Реализация параллельной обработки в коде C#
Я пытался написать один код, который должен извлекать старые значения, хранящиеся в какой-то собственной базе данных.
Для извлечения данных предусмотрены некоторые API и связанные с ними функции.Код выглядит следующим образом.
Теперь, если я запускаю этот код, он занимает почти 355 секунд. Я измерил время выполнения для одной точки, и это заняло почти 10 секунд(в среднем), чтобы сделать это.
Тест был проведен примерно с 37 такими "ПНТ", и потребовалось почти 355 секунд, чтобы получить необходимые значения.Мне нужно экспортировать то же самое в excel
тоже.Но экспорт в excel не занимает много времени по сравнению с извлечением данных из базы данных временных рядов с помощью предопределенных API.
У меня нет никакого контроля в API, и я ничего не могу сделать на том же самом.
Учитывая все это, могу ли я реализовать параллельную обработку.У меня есть машина с 24 ядрами процессора, где программа должна быть запущена.
Если кто-то может сказать мне, как реализовать то же самое в коде, это будет полезно для меня.
Я читал какую-то статью по этому поводу, но мне кажется, что это трудно реализовать в коде.
Если кто-то может помочь мне реализовать параллельную обработку в этом коде, это будет большим подспорьем в сокращении времени, затраченного программой.
Что я уже пробовал:
int i = 0, j = 0; string pnt = ""; TimeSpan span; if (periodtime.SelectedIndex == 0) { span = TimeSpan.FromSeconds(Convert.ToInt16(periodval.Text)); } else if (periodtime.SelectedIndex == 1) { span = TimeSpan.FromMinutes(Convert.ToInt16(periodval.Text)); } else { span = TimeSpan.FromHours(Convert.ToInt16(periodval.Text)); } uint s = 0; double dval = 0; DateTime ts = DateTime.Now; string st = ""; int nRet = 0; foreach (string slpnt in pntid) {
//========================================================================================== /*The point consist of a collection of strings separated by .,$ etc.It is defined inside a text file.The code reads the whole line and split a particular portion (required one) that we need to pass to API's function.*/ //That portion is stored in 'pnt' variable. pnt = slpnt.Split('-')[0].Split('$')[0]; i = 0; span = TimeSpan.FromHours(24); //GetHistMin is a function(Part of an application API) to fetch historical minimum values stored historixcal information database.Hence if .nRet =0 , it enters the loop. //Here the time range is from Convert.ToDateTime(Fdt.Text + " 00:00:00" =00:00:00 hrs to 24:00:00 hrs (Convert.ToDateTime(Fdt.Text + " 00:00:00").AddHours(24) /*Span is user given and here it is 30 seconds.Please note that it is a large data base and for 24 hrs we approximately have to search 4000 samples for a pnt variable and get the minimum out of it.We need to fetch such 50 pnt in minimum to get the desired result.*/ nRet = History.GetHistMin(pnt, Convert.ToDateTime(Fdt.Text + " 00:00:00"), Convert.ToDateTime(Fdt.Text + " 00:00:00").AddHours(24), span, out s); if (nRet == 0) { nRet = History.GetNextHist(s, out dval, out ts, out st); //GetNextHist is used to collect the resulting value the returned by GetHistMin(). if (j == 0) { //Doing the required calculation and adding it to new row of data table. dr = dt.NewRow(); dr[0] = "Minimum(of the day)"; if (slpnt.Contains("$")) { dr["C" + j.ToString()] = Math.Round(dval, 2); } else { dr["C" + j.ToString()] = Math.Round(dval, 1); } dt.Rows.Add(dr); } else { if (slpnt.Contains("$")) { dt.Rows[dt.Rows.Count - 1]["C" + j.ToString()] = Math.Round(dval, 2); } else { dt.Rows[dt.Rows.Count - 1]["C" + j.ToString()] = Math.Round(dval, 1); } } }
//==========================================================
//Like Minimum, it is calculating the Maximum of the day value. nRet = History.GetHistMax(pnt, Convert.ToDateTime(Fdt.Text + " 00:00:00"), Convert.ToDateTime(Fdt.Text + " 00:00:00").AddHours(24), span, out s); if (nRet == 0) { nRet = History.GetNextHist(s, out dval, out ts, out st); if (j == 0) { dr = dt.NewRow(); dr[0] = "Maximum(of the day)"; if (slpnt.Contains("$")) { dr["C" + j.ToString()] = Math.Round(dval, 2); } else { dr["C" + j.ToString()] = Math.Round(dval, 1); } dt.Rows.Add(dr); } else { if (slpnt.Contains("$")) { dt.Rows[dt.Rows.Count - 1]["C" + j.ToString()] = Math.Round(dval, 2); } else { dt.Rows[dt.Rows.Count - 1]["C" + j.ToString()] = Math.Round(dval, 1); } } }
//=========================================================================================================================
//Like Minimum, it is calculating the Average of the day value. nRet = History.GetHistAvg(pnt, Convert.ToDateTime(Fdt.Text + " 00:00:00"), Convert.ToDateTime(Fdt.Text + " 00:00:00").AddHours(24), span, out s); if (nRet == 0) { nRet = History.GetNextHist(s, out dval, out ts, out st); if (j == 0) { dr = dt.NewRow(); dr[0] = "Average(of the day)"; if (slpnt.Contains("$")) { dr["C" + j.ToString()] = Math.Round(dval, 2); } else { dr["C" + j.ToString()] = Math.Round(dval, 1); } dt.Rows.Add(dr); } else { if (slpnt.Contains("$")) { dt.Rows[dt.Rows.Count - 1]["C" + j.ToString()] = Math.Round(dval, 2); } else { dt.Rows[dt.Rows.Count - 1]["C" + j.ToString()] = Math.Round(dval, 1); } } } j++; }
Bernhard Hiller
Вы уверены, что правильно звонить History.GetNextHist
независимо от того, вызываете ли вы GetHistMin, GetHistMax или GetHistAvg непосредственно перед этим?