Я пытаюсь получить то, что, по моему мнению, является самой простой формой потоковой обработки для работы в моем приложении, но я просто не могу этого сделать.
Что я хочу сделать: у меня есть основная форма со статусной полосой и индикатор выполнения. Мне нужно прочитать что-то между 3 и 99 файлами и добавить их хэши в строку [], которую я хочу добавить в список всех файлов с соответствующими хэшами. Впоследствии я должен сравнить элементы в этом списке с базой данных (которая поступает в текстовые файлы). Как только все это будет сделано, я должен обновить текстовое поле в основной форме, а прогресс - до 33%; в основном я просто не хочу, чтобы основная форма зависала во время обработки.
Файлы, с которыми я работаю, всегда суммируются до 1,2 ГБ (+/- несколько МБ), то есть я должен уметь читать их в байт [] s и обрабатывать их оттуда (я должен вычислить CRC32, MD5 и SHA1 каждого из этих файлов, чтобы они были быстрее, чем чтение всех из них с жесткого диска 3 раза).
Также следует отметить, что некоторые файлы могут быть 1 МБ, а другой - 1 ГБ. Сначала мне захотелось создать 99 потоков для 99 файлов, но это кажется неразумным, я полагаю, было бы лучше повторно использовать потоки небольших файлов, в то время как большие потоки файлов все еще работают. Но это звучит довольно сложно для меня, поэтому я не уверен, что и этот мудрый.
До сих пор я пробовал workThreads и backgroundWorkers, но ни один из них не работает слишком хорошо для меня; по крайней мере, фоновые рабочие работали НЕКОТОРЫЕ из времени, но я даже не могу понять, почему они не будут в других случаях... в любом случае основная форма все еще застыла. Теперь я прочитал о параллельной библиотеке задач в .NET 4.0, но я подумал, что лучше спросить кого-то, кто знает, что он делает, прежде чем тратить больше времени на это.
То, что я хочу сделать, выглядит примерно так (без потоковой передачи):
List<string[]> fileSpecifics = new List<string[]>();
int fileMaxNumber = 42; // something between 3 and 99, depending on file set
for (int i = 1; i <= fileMaxNumber; i++)
{
string fileName = "C:\\path\\to\\file" + i.ToString("D2") + ".ext"; // file01.ext - file99.ext
string fileSize = new FileInfo(fileName).Length.ToString();
byte[] file = File.ReadAllBytes(fileName);
// hash calculations (using SHA1CryptoServiceProvider() etc., no problems with that so I'll spare you that, return strings)
file = null; // I didn't yet check if this made any actual difference but I figured it couldn't hurt
fileSpecifics.Add(new string[] { fileName, fileSize, fileCRC, fileMD5, fileSHA1 });
}
// look for files in text database mentioned above, i.e. first check for "file bundles" with the same amount of files I have here; then compare file sizes, then hashes
// again, no problems with that so I'll spare you that; the database text files are pretty small so parsing them doesn't need to be done in an extra thread.
Кто-нибудь был бы любезен, чтобы указать мне в правильном направлении? Я ищу самый простой способ быстро прочитать и хэш файлы (я считаю, что хеширование занимает некоторое время, в течение которого другие файлы уже могут быть прочитаны) и сохранить вывод в строке [] без замораживания основной формы, ничего более, не менее.
Я благодарен за любой ввод.
РЕДАКТИРОВАТЬ, чтобы уточнить: "работающие фоновые рабочие дни" Я имел в виду, что (для одного и того же набора файлов), возможно, первое и четвертое выполнение моего кода производит правильный вывод, а пользовательский интерфейс размораживается в течение 5 секунд, для второго, третьего и пятого исполнения он замораживает форму (и через 60 секунд я получаю сообщение об ошибке, в котором говорится, что какой-то поток не ответил в течение этого временного кадра), и мне нужно прекратить выполнение через VS.
Спасибо за все ваши предложения и указатели, как вы все правильно догадались, что я совершенно новичок в потоковом режиме, и вам нужно будет ознакомиться с замечательными ссылками, которые вы, ребята, разместили. Тогда я дам эти методы попробовать и обозначить ответ, который помог мне больше всего. Еще раз спасибо!