2017-01-19 9 views
0

У меня есть некоторый процесс, который выполняет итерацию по группе больших файлов по порядку и извлекает из них информацию для записи \ обновления наших баз данных. Эти файлы регулярно имеют несколько тысяч строк в каждом, поэтому я создал Parallel.ForEach для обработки нескольких строк одновременно в заданном файле (только обработка одного файла за раз, из-за необходимости применять каждый файл в порядке). Теперь мне нужно знать приблизительно, сколько из текущего файла было обработано, чтобы я мог дать руководству указание на оставшееся время выполнения. До сих пор у меня есть следующиеКак получить% от завершения Parallel.ForEach

public void MyProcess(FileItem file) 
{ 
    List<string> lines = file.GetLines(); //some process to get the lines to handle 
    long cntr = 0; //The counter to track 

    Parallel.ForEach(lines, crntLine => 
    { 
     Console.Writeline(String.Format("Currently finished {0} out of {1} lines",cntr,lines.Count()); 
     InterLocked.Increment(ref cntr); 

     //...Code to process crntLine here 

    }); 
} 

Я не забочусь вообще о том, какие строки были обработаны, только сколько общее, так что может ответить на вопрос о том, как далеко он находится в текущем файле. Будет ли это дать мне то, что я ищу надежно?

ответ

3

Interlocked.Increment безопасно увеличит ваш счетчик как атомную операцию.

Однако, если вы хотите количество строк завершенных, необходимо увеличить его после обработки строки, а не до того:

public void MyProcess(FileItem file) 
{ 
    List<string> lines = file.GetLines(); //some process to get the lines to handle 
    long cntr = 0; //The counter to track 

    Parallel.ForEach(lines, crntLine => 
    { 
     //...Code to process crntLine here 

     InterLocked.Increment(ref cntr); 
     Console.Writeline(String.Format("Currently finished {0} out of {1} lines",cntr,lines.Count()); 
    }); 
} 

Если вы хотите, процент, разделите количество завершено в общей сложности подсчитайте, затем умножьте на 100:

double percentage = (double)cntr/lines.Count * 100 
+0

Кажется, я не могу принять ответ еще на 5 минут, но это дало мне то, что мне нужно. Спасибо! – Rocky

+0

Я попадаю в ловушку. Мне нужен процент, но этот ответ всегда будет «0.00%», когда я делаю это так, как вы предложили. Вот фактическая строка кода, в которой я использую 'double percentDone = (lineCount/results.Count()) * 100;' Что происходит? – Rocky

+0

@Rocky Это 'cntr * 100/lines.Count' – Rabban