Как правильно сделать прогресс-бар для нескольких задач?
Расклад такой: необходимо пережать папку с аудиофайлами в другой формат (flac → mp3).
Хочется сделать прогресс-бар для этого процесса, но есть подводный камень. Задачи запускаются через Parallel.ForEach и рапортуют о прогрессе следующим образом: с указанной частотой вызывают делегат Progress(object writer, long inputBytes, long outputBytes, bool finished), который сообщает количество обработанных байт (inputBytes). В случае одной задачи все просто, общий размер файла делим на этот вот inputBytes и умножаем на 100. Если файлов обрабатывается несколько, их общий размер посчитать просто, а вот колличество обработаных байт я посчитать не понимаю как. Ведь inputBytes все время равно полному числу обработанных байт, а не числу байт, обработанных с последнего возникновения события, и при сложении получаются неверные числа. Надеюсь, смог объяснить понятно.
А что там такие большие файлы, что для каждого flac нужно несколько раз вызывать делегат? Может сделать прогресс бар, основанный на количестве обработанных файлов?
freeExec, если вам нужны байты, то сохраняйте предыдущее количество отработанных байт для файла. При поступлении новых данных из общего прогресса вычти предыдущее значение и прибавь новое. Но я всё же думаю, что это лишние заморочки и просто выводить общее количество полностью обработанных файлов.
Meloman19, Сейчас так и сделано. Но тут такая ситуация, что Parallel.ForEach запускает кучу задач, и прогресс бар сначала ничего не показывает, а потом сразу раз — и четыре штуки. Вот я и хотел еще какой-то побайтный индикатор. А последовательное кодирование слишком медленно происходит, понятное дело, и с ним как раз все просто.
freeExec, да, я тоже так хотел сделать, но делегат имеет следующую сигнатуру void Progress(object writer, long inputBytes, long outputBytes, bool finished), и поэтому не понятно, к какому файлу относится каждый вызов метода Progress. Оно и понятно, поскольку кодируется не файл, а поток.
Для этого придется залезть в исходники NAudio.
Я выложил тестовый стенд на битбукет, может, и посоветуете что. Сам-то я не настоящий сварщик :) batchaudioconverter