Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Программисту -> Троелсен Э. -> "С# и платформа .NET. Библиотека программиста" -> 129

С# и платформа .NET. Библиотека программиста - Троелсен Э.

Троелсен Э. С# и платформа .NET. Библиотека программиста — СПб.: Питер, 2004. — 796 c.
ISBN 5-318-00750-3
Скачать (прямая ссылка): cplatforma2004.pdf
Предыдущая << 1 .. 123 124 125 126 127 128 < 129 > 130 131 132 133 134 135 .. 320 >> Следующая

Именованные потоки 307
Результат работы этого варианта программы представлен на рис. (1.41. Конечно же, это свойство используется главным образом для того, чтобы можно было легче ориентироваться в потоках нашей системы.
Параллельная работа потоков
В предыдущем примере мы создали в нашем приложении дополнительный ЖНО;.\ Однако убедиться в том, что использование двух потоков действительно создает иллюзию многозадачности (или обеспечивает реальную многозадачность — на многопроцессорных системах), нам не удалось по простой причине — вывод 10 цифр на консоль занимает слишком мало времени. За это время нам не удастся убедиться в том, что первичный поток приложения также продолжает работу. Чтобы доказать этот факт наглядно, мы изменим определение класса WorkerClass таким образом, чтобы он выводил на конеоль не 10 цифр, а 30 ООО и для каждой из нкх использовал метод Writeiineu (а не Write О): class WorkerCl?,5s
{
public vo^d OoSoreWorkO
{
И Выполняем большую работу Console.Write("Worker says: "); fordnt 1-0: і < 30000; і++) {
Console.WriteLineCi + ~. "):
}
Cansole.WntetineO:
}
;
Теперь мы изменим McnnCiass таким образом, чтобы сразу после создания второго потока выводилось окно сообщения:
public class MainClass {
public static int Main(string[] args) {
Il Присваиваем имя текущему потоку // Создаем обьек- класса nonerQ'ms // дополнительный поток
// Пока работает фоновый потоп, наша программа будет занижаться другими // делами
MessageBox.Sho»("I 'mbusy")-.
- return 0;
}
)
При запуске приложения мы vpi-ідим, что во время работы фонового шуток; (который выводит длинный столбик цифр) появится окно сообщения, которое можно, к примеру, перетаскивать по экрану мышью (рис. 6.42).
308 Глава 6 • Сборки, потоки и домены приложений
27107. 271U8. 27109, Ї7І10. 27111. 27112, 27113, 27114, 27115, 27116, 27117, 27118. 27119,
ИГ
Рис. 6.42. Работают два активных потока
Однопоточное приложение будет вести себя совершенно по-другому. Давайте изменим метод Main О таким образом, чтобы при запуске приложения мы смогли определить, какое количество потоков будет создано:
public static int Mainfstring'J args)
{
Console.WriteC'Do you want [1] or [2] threads? "); string threadCount = Console.ReadL1n.eO:
// Присваиваем ¦• . - потоку
f
И Создаем объект класса WorkerClass WorkerClasss w = new WorkerClassO;
Il Создаем дополнительный поток, только если это указано пользователе*
if(threadCount - = "2") {
// Создаем дополнительный поток
Tnread backgrounjThread = new Thread(new ThreadStart(w.DoSomeWork)); backgrouncThread. start();
}
else
w.DoSomeWorkO;
Il Даем первичному потоку свое задание MessageBox.ShOw(Tm busy!");
return 0;
Если пользователь выбрал 1 (что означает «один поток»), то ему придется подождать, пока не будут показаны все 30 000 чисел. Только после этого будет показано окно сообщения. Если же пользователь ввел 2 и таким образом, мно-гопоточность, он сможет работать с окном сообщения и в то время, когда на консоль будут выводиться числа.
Как «усыпить» поток
Для того чтобы приостановить выполнение потока на определенное время, можно использовать статический метод Tnread.SieepC). Время, на которое поток должен
Именованные потоки 309
«зменуть», указывается при этом в миллисекундах. Для примера, давайте снова внесем изменения в класс Теперь метод будет пмнопш ¦
уже не 30 000 чисел, а всего 5, Однако между выводом каждого числа поток, который этимзлшиметси, будет «погружаться в сон* на 5 секунд.
interritj] class h'orite.-Class {
publicvold DoSomeWorkO {
// Выводим информацию о рабочей потоке
Console.W'riteLineriD of worker thread is: {O)".
Th read.Cu rrentTh rea d.GetHa s hCode O);
И Делаем работу "с перекурами" Console.Writet"Worker says: "): for (int і = 0; 1 < 5; і++) {
Console.Writetined + ". "): Thread.Sleep(5000);
}
Console.WriteLinet);
)
!
Результат работы программы представлен на рис. 6 43.
г D:\rchiM-pBiiafc\liul» \< Ь.ціГст 6 3 zi
Do you «ant [1J of 12 J tlipeai ID of Boss man is: 19 ID of worker thread Is: 21 Ifai'ker says: 0, U І. 3, Л. : 2
Jj
Рис. 6.43. Два активных процесса, опт . которых время от времени «засыпает» Код приложения SimpleMulliThreadApp можно найти в подкаталоге Chapter 6.
Одновременный доступ к данным из разных потоков
Познакомившись с предыдущими примерами, вы можете решить, что потоки — это чудодейственное средство, которое может почти все. Однако помните, что главная цель использования нескольких потоков — это повышение производительности приложения и удобства работы пользователей. При этом потоки следует использовать осторожно. Если в нашем приложении будет слишком много потоков, то производительность его работы может даже снизиться — за счет того, что процессору придется тратить много времени на переключение между потоками. Однако гораздо более серьезные проблемы могут возникнуть при одновременном доступе нескольких потоков к одним и тем же общим данным.
310 Глава 6 • Сборки, потоки и домены приложений
В нашем примере из предыдущих разделов никакой порчи данных произойти не может. Однако представьте себе, что и первичный, и дополнительный потоки изменяют один и тот же блок данных. Планировщик операционной системы выделяет потокам время центрального процессора в соответствии со своим внутренним алгоритмом, ничего не зная о целостности данных. В результате может получиться так, что первый поток начнет изменять данные и будет приостановлен, а в это время за дело возьмется другой пот к. Очень вероятно, что результат будет печален — данные будут безнадежно испорчены.
Предыдущая << 1 .. 123 124 125 126 127 128 < 129 > 130 131 132 133 134 135 .. 320 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100