Все кто смотрел первый курс по c# (Windows Forms) немало услышали про потоки, но, все таки сам для себя захотел сделать часики. Вот решил опубликовать.
Стоит напомнить, что при запуске программы запускается главный поток, и когда мы перетягиваем контроли на форму,- они создаются в главном потоке. Так вот, для того чтоб в другом потоке манипулировать этими контролами, мы прибегаем к методу Invoke(), который имеет две перегрузки и напрямую связан с делегатом!
Итак, создаем Windows Forms приложение. Перетаскиваем на форму один элемент Label.
Вот код:
namespace Clock
{
public partial class Form1 : Form
{
// делегат для манипулирования лейбом
public delegate void DelegateForTime(Label label);
// поле типа делегата
DelegateForTime DelTime;
// поток
Thread t1;
public Form1()
{
InitializeComponent();
DelTime = new DelegateForTime(StartTime);// указываем метод делегату
}
private void Form1_Load(object sender, EventArgs e)
{
t1 = new Thread(LabelTime); // создаем поток
t1.IsBackground = true; // задаем фоновый режым
t1.Priority = ThreadPriority.Lowest; // указываем свмый низкий приоритет
t1.Start(); // стартуем
}
// устанавливает время
void StartTime(Label label)
{
// выводим всегда две цыфры
// (00:00)
string s = DateTime.Now.Hour.ToString("00");
s += " : ";
s += DateTime.Now.Minute.ToString("00");
s += " : " + DateTime.Now.Second.ToString("00");
label.Text = s;
}
void LabelTime()
{
// безконечный цыкл
while (true)
{
Invoke(DelTime, label1);// запускаем метод с главного потока
}
}
}
}
Важный момент, это создание делегата и указание метода в главном потоке:
public Form1()
{
InitializeComponent();
DelTime = new DelegateForTime(StartTime);// указываем метод делегату
}
А при загрузке формы, создается новый поток, вызывается метод LabelTime() в котором с помощью метода Invoke(), связываем делегат DelTime c методом StartTime(…), и вторым параметром передаем ему сам Label. Таким образом, мы добились того, что можем манипулировать контролами, которые были созданы в главном потоке созданы.

Стили упущены, по сколку это лишнее. Их можно настроить просто покликав мышкой по свойствам формы в окне Properties.