Пример очень простой. Это всего лишь запуск пары потоков. Вторичные потоки запускаются последовательно из главного потока. А уже последовательность выполнения этих потоков определяется планировщиком.
Вторичный поток также вправе поинтересоваться о собственном имени. Надо всего лишь в правильном месте расположить этот код. И чтобы он выполнился в правильное время.
using System;
using System.Threading;
namespace ThreadApp_1
{
// Рабочий класс. Делает себе своё ДЕЛО...
class Worker
{
int allTimes;
int n;
// Конструктор умолчания...
public Worker()
{
n = 0;
allTimes = 0;
}
// Конструктор с параметрами...
public Worker(int nKey, int tKey)
{
n = nKey;
allTimes = tKey;
}
// Тело рабочей функции...
public void DoItEasy()
{//====================================
int i;
for (i = 0; i < allTimes; i++)
{
if (n == 0)
Console.Write(“{0,25}\r”,i);
else
Console.Write(“{0,-25}\r”,i);
}
Console.WriteLine(“\nWorker was here!”);
}//====================================
}
class StartClass
{
static void Main(string[] args)
{
Worker w0 = new Worker(0,100000);
Worker w1 = new Worker(1,100000);
ThreadStart t0, t1;
t0 = new ThreadStart(w0.DoItEasy);
t1 = new ThreadStart(w1.DoItEasy);
Thread th0, th1;
th0 = new Thread(t0);
th1 = new Thread(t1);
th0.Start();
th1.Start();
}
}
}
Важно! Первичный поток ничем не лучше любых других потоков приложения. Он может скоропостижно завершиться раньше всех им же порождённых потоков! Приложение же завершается после выполнения ПОСЛЕДНЕЙ команды в ПОСЛЕДНЕМ выполняемом потоке. Неважно в каком.