Примечание: Я добавил фактические фрагменты кода. Просто прокрутите до конца.Weird действующая петля в C#
// files is created by a OpenFileDialog.
public void Function(String[] files, ...)
{
for(int i; i<files.Length; i++)
{
WriteLine("File " + i + "/" + files.Length + " being processed.");
//... processing for a long time and printing information to console ...
}
//... print results, e.g.: "Results: bla bla"...
}
Функция вызывается в другом цикле. Я несколько раз запускал код и думал, что работает , пока я не увидел, что однажды он стал странным. Я при условии, описанных выше функций с длиной массива из которых было 6, а ожидаемый выход был так:
-------------------------
File 0/6 being processed.
...lots of output...
File 1/6 being processed.
...lots of output...
File 2/6 being processed.
...lots of output...
File 3/6 being processed.
...lots of output...
File 4/6 being processed.
...lots of output...
File 5/6 being processed.
...lots of output...
Results: bla bla...
-------------------------
Однако выходом я был такой:
-------------------------
File 0/1 being processed.
...lots of output...
Results: bla bla...
File 0/3 being processed.
...lots of output...
File 1/3 being processed.
...lots of output...
File 2/3 being processed.
...lots of output...
Results: bla bla...
File 0/3 being processed.
...lots of output...
File 1/3 being processed.
...lots of output...
File 2/3 being processed.
...lots of output...
Results: bla bla...
File 0/6 being processed.
...lots of output...
File 1/6 being processed.
...lots of output...
File 2/6 being processed.
...lots of output...
File 3/6 being processed.
...lots of output...
-------------------------
Когда я увидел этот выход I завершает выполнение до того, как текущий цикл был закончен (он очень быстро запускает .)
Похоже, что функция работает правильно (она запускает файлы. Длительность и выходные результаты после этого.) Однако , arg ument, переданный функции, как-то ошибочен (функцию интересно назвать более одного раза. Обычно он должен работать только один раз в этом случае. Я имею в виду, что количество строк в файле сценария определяет количество раз, когда функция вызывает функцию, а файл сценария содержит только одну строку.) Этот аргумент (массив файлов) поступает из OpenFileDialog, что означает, что я не имею никакого отношения к Это. Я просто передаю массив функции.
Я все еще пытаюсь понять причину такого странного исхода. Это произошло только один раз, но мне все еще нужно диагностировать проблему; потому что, я оставлю программу работать, возможно, на пару дней. Он должен работать правильно.
У вас есть идеи об этой ерунде?
Фактический код выше функции:
public String Start(String[] files, StreamWriter reportWriter)
{
List<SortedDictionary<int, SortedDictionary<long, int>>>[] allResults
= new List<SortedDictionary<int,SortedDictionary<long,int>>>[files.Length];
List<SortedDictionary<int, SortedDictionary<long, int>>> results;
Simulation_DenemePositionEstimator p;
Simulation_WimaxStreamReader reader;
String ret;
for (int i = 0; i < files.Length; i++)
{
System.Console.WriteLine("File " + (i+1) + "/" + files.Length + " being processed.");
reader = new Simulation_WimaxStreamReader(grids, new StreamReader(files[i]));
p = new Simulation_DenemePositionEstimator(grids, reader);
// Using parameters in script file which were saved into
// different variables when Simulation instance was created.
results =
p.StartInvestigation(maxRssiDiff, maxCinrDiff, maxAvgTxPwrDiff,
maxUncontinuity, radiusForNeighbors, expansionFactor, increment,
n, numberOfIterations, resetCountForPositioning);
allResults[i] = results;
reader.Close();
}
ret = Statistics(allResults);
System.Console.WriteLine(ret);
reportWriter.WriteLine(ret);
reportWriter.Flush();
return ret;
}
Caller код функции:
// read a line from script file.
while((line = reader.ReadLine()) != null)
{
// line starting with # is comment.
if (line.StartsWith("#") == false)
{
// save parameters retrieved from script file into an array.
values = line.Split(delimiters);
// new Simulation instance with new parameters
sim = new Simulation(map, values);
// Start simulation. scenarioFiles comes from OpenFileDialog.
report = sim.Start(scenarioFiles, reportWriter);
//reportWriter.WriteLine(report);
reportWriter.WriteLine("---------------NEW-PARAMETERS---------------");
reportWriter.Flush();
}
}
Сценарий Файл:
# Horizontal grid count
# Vertical grid count
# maxRssiDiff is the maximum RSSI difference allowed.
# maxCinrDiff is the maximum CINR difference allowed.
# maxAvgTxPwrDiff is the maximum AvgTxPwr difference allowed.
# maxUncontinuity
# radiusForNeighbors
# expansionFactor
# increment
# n -> MT'den gelen kaç değerin ortalaması alınıp yer bulma algoritmasına girdi olarak verilsin?
# Algoritma kaç adımda bir sonuçları dosyaya yazsın?
# Kaç adımdan sonra yer bulma işlemine sıfırdan başlamış gibi devam etsin?
#
# Örnek:
# 118 90 4 3 4 2 1 1 1 3 10 100
118 90 6 4 6 2 1 1 1 3 250 500
# 200 140 4 3 4 2 1 1 1 3 10 100
У вас есть петля. Код, который вы публикуете, недостаточно, чтобы воспроизвести его, я боюсь .... также: вы делаете что-нибудь интересное с помощью потоков? Может быть, связано с изворотливым «захватом»? –
Вам нужно добавить более подробную информацию, например код, вызывающий эту функцию. И, возможно, и от обработки - это обработка, сделанная async, случайно? –
Я не использую нитки. Я просто читаю файлы и делаю некоторые вычисления. Я отправлю код в ближайшее время. – blahbaa