Только на догадку попробуйте это. Сначала добавьте новый класс для представления набора параметров для myfunc
. (Это может быть даже Tuple<string, string>
).
public class MyFuncParameters
{
public string UserName { get; set; }
public string File { get; set; }
}
Затем измените свой оригинальный метод, как это:
StreamReader ImportFile = new StreamReader(@"c:\users\matthew\desktop\test.txt");
string line;
var filesToProcess = new List<MyFuncParameters>();
while ((line = ImportFile.ReadLine()) != null)
{
doneTotal++;
string[] info = line.Split('-');
string username = info.Length >= 1 ? info[0] : null;
string file = info.Length >= 2 ? info[1] : null;
filesToProcess.Add(new MyFuncParameters {File = file, UserName = username});
}
foreach (var fileToProcess in filesToProcess)
{
myfunc(fileToProcess.UserName, fileToProcess.File);
}
Других слова, сначала прочтите все, что вам нужно от одного файла, а затем, если вы перебор другого списка файлов (созданного из исходного файла) сделайте следующее. Вы можете увидеть некоторую улучшенную производительность, не прочитав один файл, а затем сделав что-то (myfunc
), с другим файлом между чтениями в исходный файл.
Это предположение. Вероятно, это зависит от того, что именно делает myfunc
, так как вы указали, что это медленная часть.
Как указано в комментариях, вы можете запускать столько параллельных потоков для чтения файлов, сколько хотите, но только один из них может действительно читать с диска за раз, поэтому на самом деле это не очень хорошо. Это может сделать даже медленнее.
Я уверен, что медленный процесс - это ввод-вывод. Вы не можете использовать многопоточный ввод-вывод для повышения производительности. Просто прочитайте весь файл в виде одной строки и обработайте каждую строку отдельно. – Gus
не мог читать во всех строках, а затем перебирать их в параллельном foreach? –
@Gus & Steven Файлы, которые я использую, иногда слишком велики для открытия, поэтому я думаю, что я должен использовать это, если нет другого способа открыть большой файл? – wtm