Использование свойства потока IsAlive

163
17 февраля 2019, 12:20

Разбирая тему многопоточности по Шиелду 4.0, столкнулся с проблемой. В книге описано, что свойство IsAlive возвращает true если поток, на котором он вызывается, активен. Пишу следующий код:

class MyThread
{
    public int Count;
    public Thread thr2;
    public MyThread(string name)
    {
        Count = 0;
        thr2 = new Thread(this.Run);
        thr2.Name = name;
        thr2.Start();
    }
    public void Run()
    {
        Console.WriteLine($"{thr2.Name} начат");
        for (int counter = Count; counter < 10; counter++)
        {
            Thread.Sleep(500);
            Console.WriteLine($"В потоке {thr2.Name} Count = {Count}");
            Count++;
        }
        Console.WriteLine($"{thr2.Name} завершен.");
    }
}

И точка входа в программу:

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("Основной поток начат");
        MyThread first = new MyThread("Vasya");
        Thread newThrd = new Thread(first.Run);
        do
        {
            Console.Write(".");
            Thread.Sleep(100);
        } while (first.Count < 10);
        Console.WriteLine("Основной поток завершен.");
        Console.ReadKey();
    }
}

По замыслу, если в цикле while-do в классе Program вместо first.Count < 10 написать newThrd.IsAlive, то результат выполнения программы не должен измениться. Однако на деле, при выполнении программы, основной поток может завершится сразу же после того, как будет создан другой поток. С помощью отладки иду по коду, и вижу, что свойство IsAvive принимает значение false, даже если другой поток не закончил свое выполнение. Почему так происходит, и как правильно написать программу используя свойство IsAlive?

Answer 1

осознал ошибку, необходимо вызывать свойство на объекте именно мною созданного класса. Так:

do
{
  Console.Write(".");
  Thread.Sleep(100);
} while (first.thr2.IsAlive);

Я же вызвал на объекте потока, который никакого отношения к программе не имеет.

READ ALSO
Elasticsearch поиск по полю

Elasticsearch поиск по полю

Есть сервер Elsaticsearch с ним общаюсь по средствам Nest

172
Создание мультиязычного меню

Создание мультиязычного меню

создал мультиязычное меню, но при обращении к нему выводить такую ошибку Call to a member function getDataMenu() on arrayГде я ошибся? Вот код виджета

177
автообновление парсера php

автообновление парсера php

Есть парсер на php,

127
PHP Socket Android система сообщений. Как это устроено?

PHP Socket Android система сообщений. Как это устроено?

Хочу реализовать систему обмена сообщений на клиентских Android приложениях через PHP серверОпыта нет, только теоретические данные

180