Разбирая тему многопоточности по Шиелду 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?
осознал ошибку, необходимо вызывать свойство на объекте именно мною созданного класса. Так:
do
{
Console.Write(".");
Thread.Sleep(100);
} while (first.thr2.IsAlive);
Я же вызвал на объекте потока, который никакого отношения к программе не имеет.
создал мультиязычное меню, но при обращении к нему выводить такую ошибку Call to a member function getDataMenu() on arrayГде я ошибся? Вот код виджета
Хочу реализовать систему обмена сообщений на клиентских Android приложениях через PHP серверОпыта нет, только теоретические данные