Скачать презентацию
Идет загрузка презентации. Пожалуйста, подождите
Презентация была опубликована 11 лет назад пользователемНикита Недоквасов
1 Модель приложений.NET
2 Среда платформы Win32, в которой выполняется программа, называется ее процессом. Эта среда состоит из: адресного пространства, в котором хранится код и данные программы; набора переменных среды, связанных с программой; текущего диска и папки; одного или более потоков. Процесс это единица, которая характеризуется собственным набором внешних ресурсов и выделенной приложению областью оперативной памяти
3 Потоки и домены приложений.NET Первый поток, создаваемый в процессе, называется первичным процессом (primary thread). В графических приложениях Windows такой точкой входа является метод WinMain(), а в консольных приложениях метод Main(). Выполняемый файл.NET помещается в обособленный логической раздел процесса, называемый доменом приложения (AppDomain). Один процесс может содержать множество доменов приложения, каждый из которых будет обслуживать свой выполняемый файл.NET.
4 Преимущества доменов являются ключевым аспектом независимой от ОС природы платформы.NET, поскольку такое логическое деление абстрагируется от того, как именно ОС представляет загруженный, выполняемый объект, являются существенно менее ресурсоемкими во времени процессора и памяти, чем весь процесс в целом, Поэтому среда CLR способна загружать и выгружать домены приложений намного быстрее, чем формальный процесс. обеспечивают лучший уровень изоляции для загруженного приложения. Если один домен приложения в рамках процесса "терпит неудачу", остальные домены приложений могут продолжать функционировать. любой домен приложения состоит из одного или нескольких контекстов. Используя контексты, среда CLR может поместить объект со "специальными требованиями в логический контейнер, чтобы гарантировать выполнение этих требований в среде выполнения.
5 Класс Thread Статические члены класса: CurrentThread - свойство только для чтения возвращает ссылку на поток, выполняемый в настоящее время GetDomain(), GetDomainlD() - возвращает ссылку на домен приложения (идентификатор домена приложения), в рамках которого работает указанный поток Sleep() - приостанавливает выполнение текущего потока на указанное пользователем время
6 Класс Thread Обычные члены класса: IsAlive - свойство возвращает «true» или «false» в зависимости от того, запущен поток или нет IsBackground - свойство предназначено для получения или установки значения, которое показывает, является ли этот поток фоновым Name - свойство для установки дружественного текстового имени потока Priority - позволяет получить/установить приоритет потока (используются значения из перечисления ThreadPrority) ThreadState - возвращает информацию о состоянии потока (используются значения из перечисления ThreadState) Interrupt() - прерывает работу текущего потока Join() - ждет появления другого потока (или указанный промежуток времени) и завершается Resume() - продолжает работу после приостановки работы потока Start() - начинает выполнение потока, определенного делегатом ThreadStart Suspend() - приостанавливает выполнение потока. Если выполнение потока уже приостановлено, то игнорируется
7 Создание рабочего потока 1. В классе создайте метод, который будет использоваться в качестве точки входа нового потока. 2. Создайте делегат ParameterizedThreadStart (или ThreadStart), передав eго конструктору адрес метода, определенного на шаге Создайте объект Thread, передав конструктору делегат ParameterizedThreadStart /ThreadStart в виде аргумента. 4. Задайте подходящие начальные характеристики потока (имя, приоритет и т.д.). 5. Вызовите метод Thread. Start()- это указание как можно быстрее стартовать поток для метода, на который ссылается делегат, созданный на шаге 2. public delegate void ThreadStart(); public delegate void ParameterizedThreadStart (Object );
8 Создание рабочего потока public delegate void ThreadStart(); using System.Threading; class NewThread { public void Make() { Console.WriteLine( "Thread {0} starting.", Thread.CurrentThread.GetHashCode().ToString()); long i=0; while(i
9 Приостановка и возобновление работы потока static void Main(string[] args) { NewThread res = new NewThread(); ThreadStart threadde1 = new ThreadStart(res.Make); Thread thread1 = new Thread(threadde1); Thread thread2 = new Thread(threadde1); thread1.Start (); thread1.Suspend();// Приостановка thread2.Start (); thread1.Resume();// Возобновление thread1.Join(); // Ожидание окончания работы потока thread2.Join(); Console.WriteLine("Done!"); // Завершен основной поток }
10 Приоритетные и фоновые потоки Приоритетные потоки обеспечивают текущему приложению защиту от преждевременного завершения. Среда CLR не прекратит работу приложения (лучше сказать, не выгрузит соответствующий домен приложения), пока не завершат работу все приоритетные потоки. Фоновые потоки (демонамы) рассматриваются средой CLR как возобновляемые ветви выполнения, которыми можно пренебречь в любой момент времени (даже при выполнении ими своих задач). Поэтому, когда все приоритетные потоки завершаются, все фоновые потоки будут завершены автоматически в результате выгрузки домена приложения. Thread[] threads = new Thread[10]; for (int i = 0; i < 10; i++) { threads[i] = new Thread (new ThreadStart(res.Make)); threads [i].Name = string. Format (''Рабочий поток {0}", i); } foreach (Thread t in threads) t. Start();
11 Приоритеты потоков Приоритеты потоков задаются перечислением. public enum ThreadPriority { AboveNormal, BelowNormal, Highest, Midle, Lowest, Normal // значение по умолчанию TimeCritical }
12 Синхронизация потоков class NewThread { public void Make() { Console.WriteLine( "Thread {0} starting.", Thread.CurrentThread.GetHashCode().ToString()); long i=0; while(i
13 Синхронизация с помощью ключевого слова lock class NewThread { public void Make() { lock(this) { Console.WriteLine( "Thread {0} starting.", Thread.CurrentThread.GetHashCode().ToString()); long i=0; while(i
14 Синхронизация с помощью мониторов Монитор – это механизм управления связью между процессами. Как только поток входит в монитор, все другие потоки должны ждать, пока он не выйдет из монитора. Служит для защиты разделяемого ресурса. Monitor.Enter(this); // Монитор.Войти... (спорный код потока здесь) Monitor.Exit(this); // Выход
15 public class NewThread { public void Make() { Console.WriteLine( "Thread {0} starting.", Thread.CurrentThread.GetHashCode().ToString()); long i=0; while(i
16 Уведомление с помощью мониторов class Q { int n; bool valueSet = false; public int get() { if (!valueSet) Monitor.Wait(this); Console.WriteLine("Got: " + n); valueSet = false; Monitor.Pulse(this); return n; } public void put(int n) { if (valueSet) Monitor.Wait(this); this.n = n; valueSet = true; Console.WriteLine("Put: " + n); Monitor.Pulse(this); }
17 class Consumer { Q q; public bool flag = true; public Consumer(Q q) { this.q = q; ThreadStart threadde2 = new ThreadStart(run); Thread thread2 = new Thread(threadde2); thread2.Start(); } public void run() { while (flag) { Monitor.Enter(q); q.get(); Thread.Sleep(1000); Monitor.Exit(q); } } } class Producer { Q q; public bool flag = true; public Producer(Q q) { this.q = q; ThreadStart threadde1 = new ThreadStart(run); Thread thread1 = new Thread(threadde1); thread1.Start(); } public void run() { int i = 0; while (flag) { Monitor.Enter(q); q.put(i++); Thread.Sleep(1000); Monitor.Exit(q); }
18 class Program { static void Main(string[] args) { Q q = new Q(); Producer o1= new Producer(q); Consumer o2 = new Consumer(q); Thread.Sleep(10000); o1.flag = false; o2.flag = false; Console.WriteLine("Завершение главного потока"); }
19 Синхронизация с помощью атрибута [Synchronization] using System.Runtime. Remoting.Contexts; [Synchronization] public class NewThread { public void Make() {…} }
Еще похожие презентации в нашем архиве:
© 2024 MyShared Inc.
All rights reserved.