2013-07-08 3 views
1

У меня есть программа, которая использует несколько потоков (300) для запроса API. В настоящее время он ведет себя как искатель, каждый поток определяет свой следующий вызов веб-API на основе результата вызова API, который он только что обработал, и случайного параметра.Как читать текстовый файл из нескольких потоков C#

Я построил список параметров, которые выберут «случайный параметр» из уравнения и сделают его более эффективным, исключив избыточные вызовы API, возникшие в результате использования этого случайного параметра.

Этот список представлен в виде текстового файла длиной около 8 миллионов.

В идеале, что бы я хотел иметь, это объект чтения потока в моем основном потоке, который был бы потокобезопасным и что все (300) другие потоки будут использовать «getLine» из текстового файла, когда они будут обработаны последний до исчерпания файла.

Я немного потерял то, на что я должен смотреть, любые предложения и ответы будут очень благодарны!

+1

Вы имеете в виду * действительно * есть 300 потоков в вашем приложении? Не прочитав остальной вопрос, я могу сразу сказать, что вы делаете что-то неправильно. Чтобы ответить на ваш вопрос, вы должны посмотреть [ConcurrentQueue] (http://msdn.microsoft.com/en-us/library/dd267265.aspx). –

+0

@ LasseV.Karlsen Да, и 300 потоков - это оптимальное количество потоков с точки зрения того, сколько страниц я могу сканировать в минуту. –

+0

@ LasseV.Karlsen Это похоже на то, что мне нужно, вопрос только в том, столкнулся ли я с проблемой, когда в эту очередь попало 8 миллионов ulongs? –

ответ

0

Первый способ

public static string GetLineThreadSafe(this StreamReader sr) 
    { 
     lock (sr) 
     { 
      return sr.EndOfStream ? null : sr.ReadLine(); 
     } 
    } 

Второй способ

public static IEnumerable<string> GetEnumirator(this StreamReader sr) 
    { 
     while (!sr.EndOfStream) 
     { 
      yield return sr.ReadLine(); 
     } 
    } 

    public static void ProcessParalel(this StreamReader sr, Action<string> action, int threadsCount) 
    { 
     ParallelOptions po = new ParallelOptions(); 
     po.MaxDegreeOfParallelism = threadsCount; 
     Parallel.ForEach(sr.GetEnumirator(), po, action); 
    } 
Смежные вопросы