Страницы

Поиск по вопросам

среда, 22 января 2020 г.

Многопоточный перебор массива

#c_sharp #многопоточность #потоки_данных


Здравствуйте. Есть следующий код, который загружает файл со словами в массив, допустим,
содержание файла такое:
Привет
Пока
Магазин
Телефон
Монитор
.... // и т.д. Очень много слов 
Нужно сделать потоки для этого кода. Я пока не разобрался, как.
class Test
{

    static string Text;
    static string[] ReadFile;
    static int Threads;

    static void Main()
    {

        Console.Write("Введите слово которое необходимо проверить: ");
        Text = Console.ReadLine();

        Console.Write("Введите количество потоков: ");
        Threads = Convert.ToInt32(Console.ReadLine());

        ReadFile = System.IO.File.ReadAllLines("slova.txt");

        for (int i = 0; i < Threads; i++) // ну типо потоки запускаем
        {
            (new Thread(new ThreadStart(Slova))).Start();
        }
    }

    static void Slova()
    {

       for (int i = 0; i < ReadFile.Length; i++)
       {
            if (ReadFile[i] == Text)
            {
              Console.Write("Слово " + Text + " успешно найдено в файле " + ReadFile);
            }
       }
    }
}

Дело в том, что этот код находит строку в файле и сверяет её с переменной Text столько
раз, сколько установлено потоков, то есть если потоков 50, то он возьмет первую строку
из файла и проверит её 50 раз, далее вторую и так далее, и сообщение о нахождении строки
тоже 50 раз.
Можно сделать в место for 
foreach (string textline in ReadFile) { .. } // тоже самое будет

Как это исправить? Чтобы потоки хорошо работали. Я не очень разбираюсь в C#. Помогите,
пожалуйста.    


Ответы

Ответ 1



Вы запускаете на каждую итерацию цикла новый поток. Вот и получается 50 потоков. Используйте готовый мультипотоковый цикл. Parallel.For(0, length, i => { // Тело цикла. }); подробней о Parallel.For Или разделите цикл на N частей по длине и в каждой создайте поток. Получите N-поточный цикл.

Ответ 2



Можно использовать PLINQ. Удобная вещь особенно для многопоточной обработки данных. Вот еще одна интересная статья пэтой теме.

Комментариев нет:

Отправить комментарий