- •Лабораторная работа № 1. Введение в многопоточность. Многопоточность в c# .Net.
- •Базовые методы работы с потоками в c# .Net.
- •Лабораторная работа № 2. Разработка простого многопоточного компонента с помощью Visual c#
- •Чтобы создать форму, выполните следующие действия.
- •Чтобы создать компонент "Калькулятор", выполните следующие действия.
- •Чтобы добавить в компонент "Калькулятор" общие переменные, выполните следующие действия.
- •Чтобы добавить в компонент "Калькулятор" методы и события, выполните следующие действия.
- •Чтобы реализовать в форме "frmCalculations" интерфейс пользователя, выполните следующие действия.
- •Чтобы проверить проект, выполните следующие действия.
- •Чтобы добавить подпрограмму "Threads", выполните следующие действия.
- •Чтобы добавить соответствующий код в форму "frmCalculations", выполните следующие действия.
- •Чтобы создать процедуры для вызова элементов управления, выполните следующие действия.
- •Чтобы добавить оператор "lock" в приложение, выполните следующие действия.
Чтобы проверить проект, выполните следующие действия.
В меню Отладка выберите команду Начать отладку.
Приложение
начнет работу и появится форма
frmCalculations
.
В текстовом поле введите 4, а затем нажмите кнопку с надписью Прибавить два.
Под
кнопкой должна появиться цифра "6",
а в метке lblTotalCalculations
должен быть отображен текст "Всего
вычислений — 1".
Теперь нажмите кнопку с надписью Факториал - 1.
Под
кнопкой должна появиться цифра 6, а метка
lblTotalCalculations
теперь содержит текст "Всего вычислений
— 4".
Измените значение текстового поля на 20, а затем нажмите кнопку с надписью Факториал.
Под
кнопкой должно появиться число
"2.43290200817664E+18", а метка lblTotalCalculations
теперь содержит текст "Всего вычислений
— 24".
Измените значение текстового поля на 50000, а затем нажмите кнопку с надписью Выполнить цикл.
Заметьте, что перед тем, как кнопка вновь станет доступна, пройдет небольшой, но заметный интервал времени. В метке под кнопкой должно отображаться "50000", а общее количество вычислений теперь равно 25000024.
Измените значение текстового поля на 50000, нажмите кнопку с надписью Выполнить цикл и непосредственно после этого нажмите кнопку Добавить два. Нажмите кнопку еще раз.
Кнопка не будет реагировать (так же как и все остальные элементы управления в форме), пока не завершится цикл.
Если в программе запускается только один поток выполнения, занимающие процессор вычисления (аналогичные приведенным выше) могут приостанавливать программу, пока они не будут закончены. В следующем разделе приложение будет дополнено поддержкой многопоточности, в результате чего несколько потоков смогут выполняться одновременно.
Добавление поддержки многопоточности
В предыдущем примере были показаны ограничения, характерные для приложений, в которых запускается только один поток выполнения. В следующем разделе в компонент будет добавлено несколько потоков выполнения с помощью класса Thread.
Чтобы добавить подпрограмму "Threads", выполните следующие действия.
Откройте файл Calculator.cs в Редакторе кода.
В начале кода найдите объявление класса и сразу после знака
{
введите следующий код.
// Declares the variables you will use to hold your thread objects.
public System.Threading.Thread FactorialThread;
public System.Threading.Thread FactorialMinusOneThread;
public System.Threading.Thread AddTwoThread;
public System.Threading.Thread LoopThread;
Непосредственно перед концом объявления класса в нижней части кода добавьте следующий метод.
public void ChooseThreads(int threadNumber)
{
// Determines which thread to start based on the value it receives.
switch(threadNumber)
{
case 1:
// Sets the thread using the AddressOf the subroutine where
// the thread will start.
FactorialThread = new System.Threading.Thread(new
System.Threading.ThreadStart(this.Factorial));
// Starts the thread.
FactorialThread.Start();
break;
case 2:
FactorialMinusOneThread = new
System.Threading.Thread(new
System.Threading.ThreadStart(this.FactorialMinusOne));
FactorialMinusOneThread.Start();
break;
case 3:
AddTwoThread = new System.Threading.Thread(new
System.Threading.ThreadStart(this.AddTwo));
AddTwoThread.Start();
break;
case 4:
LoopThread = new System.Threading.Thread(new
System.Threading.ThreadStart(this.RunALoop));
LoopThread.Start();
break;
}
}
Когда
будет создан экземпляр объекта Thread,
ему потребуется аргумент в виде объекта
ThreadStart.
Объект
ThreadStart
— это делегат, указывающий на адрес
метода, в котором начинается поток.
Объект
ThreadStart
не может принимать параметры или
передавать значения, и поэтому он может
определять только метод void.
Реализованный
здесь метод ChooseThreads
будет получать значение из вызывающей
его программы и использовать это значение
для определения запускаемого потока.