Как ждать завершения фоновых потоков c# Thread

214
09 мая 2018, 01:59

Нужно высчитать кол-во букв в строке. Запускаю несколько потоков которые синхронно считают в заданных местах. В итоге программа не правильно работает. Вопрос, как поставить ожидание основной поток пока не завершаться потоки для поиска. Или может быть проблема в другом. Есть ли вариант, чтобы основной поток, ждал завершения всех потоков, которые работают параллельно, как WaitAll в таске.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Text.RegularExpressions;
namespace ConsoleApplication12
{
class Program
{
    static void Main(string[] args)
    {
        int k = 0;
        object locker = new object();
        Console.WriteLine("Введите строку для поиска в ней букв");
        string p = "ppppppppppppppppppp"; //Console.ReadLine();
        Console.WriteLine("Введите букву");
        char pattern = 'p';// Console.ReadKey().KeyChar;
        //Console.ReadLine();
        Console.WriteLine("Кол-во потоков");
        int kol_thread = 5;// int.Parse(Console.ReadLine());
        int len = p.Length / (kol_thread);
        for (int i = 0; i < kol_thread; i++)
        {
            int endPos;
            {
                if (i == kol_thread - 1)
                    endPos = p.Length;
                else
                    endPos = len*(i+1);
            }
             Thread task3 = new Thread(() =>
             {
                 int r = 0;
                 for (int z = len * i; z < endPos; z++)
                 {
                     //inp += p[z];
                     if (p[z] == pattern)
                        r++;
                 }

                 lock (locker)
                 {
                     k += r;
                 }
             });

             task3.Start();
         }
        //Thread.CurrentThread;// 
        Threed.Sleep(200);
        Console.WriteLine("Кол-во букв в строке: "+k);
        Console.ReadKey();

    }

}
}

Так же была идея создать массив, и остановить через Join, весь массив не удалось загнать в джоин.

      threads[i] = new Thread(() =>
            {
                int r = 0;
                for (int z = len * i; z < endPos; z++)
                {
                    //inp += p[z];
                    if (p[z] == pattern)
                        r++;
                }

                lock (locker)
                {
                    k += r;
                }
            });
            threads[i].Start();
            //threads[i].Join();//Получается линейное выполнение потоков
            //threads.Join<>//но так остановить массив нельзя
Answer 1

Вы шли в верном направлении, чтобы ждать потоки, надо их куда то сохранить. Только вы ждать поток пробовали в том же цикле, где потоки создавали, а верным будет сначала создать потоки, а потом уже ожидать. Как пример:

var threads = new Thread[kol_thread];
for (int i = 0; i < kol_thread; i++)
{
    .......
    Thread task3 = new Thread(() =>
    {
        .....................
    });
    threads[i] = task3;
    task3.Start();
}
for (int i = 0; i < kol_thread; i++)
{
    threads[i].Join();
}
READ ALSO
Как средствами C# отправлять сообщения разным ботам в TELEGRAM?

Как средствами C# отправлять сообщения разным ботам в TELEGRAM?

Как средствами C# отправлять сообщения разным ботам в TELEGRAM? Именно ботам так как отправлять сообщение юзерам или группам у меня получилось...

214
Автоматически развернуть detils в master/details моде

Автоматически развернуть detils в master/details моде

У меня есть таблица gridControl с двумя gridView соединенных паттерном master/details одним отношением (RelationsCount = 1)

253
C# Unity Input Fields

C# Unity Input Fields

В классе class_1 Есть несколько массивов класса InputField, которым я присвоил значения путём перетаскивания в UnityСоздаю два экземпляра классов class_2...

224
Селениум не находит елемент [требует правки]

Селениум не находит елемент [требует правки]

Селениум не находит елемент (прикрепить файл)Нужно по нему кликнуть

221