2016-07-01 2 views
-1

Я искал некоторые примеры в google, но я не мог найти что-то, что мне нужно.C# Параллельный/многопоточный a

У меня это время цикла:

StreamReader ImportFile = new StreamReader(@"c:\users\matthew\desktop\test.txt"); 

string line; 
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; 

    myfunc(username, file); 
} 

Так, MyFunc быстр, но не достаточно быстро для меня. Как я могу использовать параллельный или многопоточный цикл while?

Спасибо.

+2

Я уверен, что медленный процесс - это ввод-вывод. Вы не можете использовать многопоточный ввод-вывод для повышения производительности. Просто прочитайте весь файл в виде одной строки и обработайте каждую строку отдельно. – Gus

+0

не мог читать во всех строках, а затем перебирать их в параллельном foreach? –

+0

@Gus & Steven Файлы, которые я использую, иногда слишком велики для открытия, поэтому я думаю, что я должен использовать это, если нет другого способа открыть большой файл? – wtm

ответ

1

Только на догадку попробуйте это. Сначала добавьте новый класс для представления набора параметров для 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, так как вы указали, что это медленная часть.

Как указано в комментариях, вы можете запускать столько параллельных потоков для чтения файлов, сколько хотите, но только один из них может действительно читать с диска за раз, поэтому на самом деле это не очень хорошо. Это может сделать даже медленнее.

0

Я думал, что разместил это в своем другом ответе, но я не вижу его.

Можете ли вы изменить то, что вы отправляете на сервер, чтобы вместо публикации нескольких запросов с одним именем пользователя и одним именем файла вместо этого вы отправляли коллекцию? Один (или несколько) больших запросов будет намного быстрее, чем много маленьких. Каждый элемент обрабатывает одно и то же время, но вы удаляете накладные расходы на выполнение всех индивидуальных вызовов.

Смежные вопросы