Многопоточность синхронизация

101
08 декабря 2020, 07:10

Как закончить работу программы корректно:

class Program
{
    static void Main(string[] args)
    {
        List<double> mass = new List<double>()
        {
            1,
            2,
            3,
            6,
            7,
            13,
            21
        };
        Analysis analysis = new Analysis(mass);
        if (analysis.task1.IsAlive == false && analysis.task2.IsAlive == false)
        {
            analysis.Show_Res();
        }
        Console.ReadKey();
    }
}
public class Analysis
{
    List<double> mass;
    public Thread task1;
    public Thread task2;
    public Analysis(List<double> mass)
    {
        this.mass = mass;
        task1 = new Thread(Fibonachi);
        task2 = new Thread(Prime_Numbers);
        task1.Start();
        task2.Start();
    }
    public void Show_Res()
    {
        StreamReader read1 = new StreamReader("Fibonachi.txt");
        string line = "";
        Console.WriteLine("Найденны числа фибоначи");
        while ((line = read1.ReadLine()) != null)
        {
            Console.WriteLine(line);
        }
        read1.Close();
        StreamReader read2 = new StreamReader("Prime_Numbers.txt");
        Console.WriteLine("Найдены простые числа");
        while ((line = read2.ReadLine()) != null)
        {
            Console.WriteLine(line);
        }
        read2.Close();
    }
    public  void Fibonachi()
    {
        StreamWriter str1 = new StreamWriter("Fibonachi.txt");
        for (var i = 2; i < mass.Count; i++)
        {
            if (mass[i - 2] + mass[i - 1] == mass[i])
            {
                str1.WriteLine(mass[i]);
            }
        }
        str1.Close();
        task1.Abort();
    }
    public void Prime_Numbers()
    {
        StreamWriter str = new StreamWriter("Prime_Numbers.txt");
        bool prost;
        for (var i = 0; i < mass.Count; i++)
        {
            prost = true;
            for (int j = 2; j <= mass[i] / 2; j++)
            {
                if (mass[i] % j == 0)
                {
                    prost = false;
                    break;
                }
            }
            if (prost)
            {
                str.WriteLine(mass[i]);
            }
        }
        str.Close();
        task2.Abort();
    }
}

Как мне вызывать этот 3 метод Show_Res, я уже как не пробовал, не понимаю, как мне с синхронизировать эту чертову колесницу, для меня пока многопоточность самая больная тема, подскажите пожалуйста. Если с объяснениями буду при много благодарен!(

Answer 1

Чтобы дождаться конца треда, надо вызвать myThread.Join();, thread.Abort(); вызывать без причины не надо. Добавил минимум изменений в ваш код, но не проверял, не запускал. В идеале вообще для этого использовать таски, а не потоки.

class Program
{
    static void Main(string[] args)
    {
        List<double> mass = new List<double>()
        {
            1,
            2,
            3,
            6,
            7,
            13,
            21
        };
        Analysis analysis = new Analysis(mass);
        analysis.task1.Join();
        analysis.task2.Join();

        var task3 = new Thread(analysis.Show_Res);
        task3.Start();
        task3.Join();   
        Console.ReadKey();
    }
}
public class Analysis
{
    List<double> mass;
    public Thread task1;
    public Thread task2;
    public Analysis(List<double> mass)
    {
        this.mass = mass;
        task1 = new Thread(Fibonachi);
        task2 = new Thread(Prime_Numbers);
        task1.Start();
        task2.Start();      
    }
    public void Show_Res()
    {
        using (StreamReader read1 = new StreamReader("Fibonachi.txt"))
        {
            string line = "";
            Console.WriteLine("Найденны числа фибоначи");
            while ((line = read1.ReadLine()) != null)
            {
                Console.WriteLine(line);
            }
        }
        using (StreamReader read2 = new StreamReader("Prime_Numbers.txt"))
        {
            string line = "";
            Console.WriteLine("Найдены простые числа");
            while ((line = read2.ReadLine()) != null)
            {
                Console.WriteLine(line);
            }
        }
    }
    public void Fibonachi()
    {
        using (StreamWriter str1 = new StreamWriter("Fibonachi.txt"))
        {
            for (var i = 2; i < mass.Count; i++)
            {
                if (mass[i - 2] + mass[i - 1] == mass[i])
                {
                    str1.WriteLine(mass[i]);
                }
            }
        }
    }
    public void Prime_Numbers()
    {
        using (StreamWriter str = new StreamWriter("Prime_Numbers.txt"))
        {
            bool prost;
            for (var i = 0; i < mass.Count; i++)
            {
                prost = true;
                for (int j = 2; j <= mass[i] / 2; j++)
                {
                    if (mass[i] % j == 0)
                    {
                        prost = false;
                        break;
                    }
                }
                if (prost)
                {
                    str.WriteLine(mass[i]);
                }
            }
        }
    }
}
READ ALSO
Логирование и сохранение в php monolog

Логирование и сохранение в php monolog

Всем привет, мне нужно сделать лог вставки в базу данных и сохранить этот лог в файлНаведите пожалуйста пример или документацию ибо я не нашел

113
Как передать id в ajax по клику

Как передать id в ajax по клику

Делаю корзину, много товаров, хотел прикрутить ajax на тык по кнопке, не могу понять как передать значение $cartItem->rowId для удаления выбранного...

159
Websocket is not defined / WORKERMAN

Websocket is not defined / WORKERMAN

Делаю вебсокеты на php с workermanЗапускается на сервере успешно, но прослушать не могу

151