Страницы

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

суббота, 9 марта 2019 г.

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

Здравствуйте. Есть следующий код, который загружает файл со словами в массив, допустим, содержание файла такое: Привет Пока Магазин Телефон Монитор .... // и т.д. Очень много слов Нужно сделать потоки для этого кода. Я пока не разобрался, как. 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#. Помогите, пожалуйста.


Ответ

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

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

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