Что такое отдельный поток? В первом приближении это некоторая отдельная часть программы, которая может выполняться параллельно с другими частями программы. Ключевое слово тут - параллельно. Т. е. в одном своем потоке программа может делать некоторое длительное действие, а в другом потоке - другое, и эти действия будут выполняться параллельно.
Классический пример использования потоков можно найти в программе Word - тут в одном потоке может происходить фоновая проверка орфографии, в другом - печать текста пользователем, в третьем - сохранение файла на жесткий диск.
Для использования потоков в программе мы используем пространство имен System.Threading. Простейший поток - это экземпляр класса Thread из этого пространства имен.
Рассмотрим пример использования потоков в Windows-приложении. Создайте обычное Windows-приложение на C#. Разместите на форме две кнопки, заголовки на которых поменяйте на Start Thread и MsgBox соответственно. По первой кнопке мы запустим поток, в котором бы будем выполнять некоторое продолжительное действие (оно будет длиться несколько секунд). По второй кнопке мы будем выполнять некоторое параллельное действие (там мы просто вызовем обычный MessageBox).
|
|
Вот что вы должны добавить в текст программы (т. е. в класс формы):
...
using System.Threading; // Добавляем нужное пространство имен.
...
// Первый поток.
public Thread thr1;
// Вызываемая в потоке функция.
void f1()
{
// Запуск длинной операции.
for(int i=0; i<3000; i++)
{
// Результаты показываем в заголовке окна.
Text = i.ToString();
}
}
private void button1_Click(object sender, System.EventArgs e)
{
// Создание нового потока.
thr1 = new Thread(new ThreadStart(f1));
// Запуск нового потока.
thr1.Start();
}
private void button2_Click(object sender, System.EventArgs e)
{
// Некоторое параллельное действие.
MessageBox.Show("Some Action");
}
...
Наш поток создается в обработчике щелчка по первой кнопке. Обратите внимание, что при вызове конструктора мы указываем, что за метод будет выполняться в нашем потоке (а именно метод с именем f1):
...
thr1 = new Thread(new ThreadStart(f1));
...
Разумеется, метод f1 должен быть определен в нашем классе. В нем мы просто запускаем для демонстрации длинный цикл, в котором выводим возрастающие числа в заголовок окна.
Запускаем программу. При нажатии на первую кнопку запустится функция f1 в отдельном потоке. В заголовке окна замелькают последовательные числа. И, что самое важное, на вторую кнопку тоже можно будет нажимать до окончания работы обработчика первой кнопки - при этом появится соответствующий MessageBox: