В c# в межах однієї програми може бути запущено декілька потоків в c# в межах однієї програми може бути запущено декілька потоків


НазваВ c# в межах однієї програми може бути запущено декілька потоків в c# в межах однієї програми може бути запущено декілька потоків
Дата конвертації06.04.2013
Розмір445 b.
ТипПрезентации



В C# в межах однієї програми може бути запущено декілька потоків.

  • В C# в межах однієї програми може бути запущено декілька потоків.

  • Простір імен System.Threading.

  • Для створення потоків використовується делегат ThreadStart.

  • Можливий запуск:

  • ThreadStart st = new ThreadStart(метод);

  • Thread t = new Thread(st);

  • t.Start();



class Program

  • class Program

  • { private static void Fun() {

  • Console.WriteLine("This is other thread");

  • for (int i = 1; i <= 100; i++) {

  • Console.Write(i + " "); Thread.Sleep(200); }

  • }

  • static void Main(string[] args)

  • {

  • Thread otherThread = new Thread(new ThreadStart(Program.Fun));

  • Console.WriteLine("This is main thread");

  • otherThread.Start();

  • Console.WriteLine("New thread launched");

  • otherThread.Join();

  • Console.WriteLine("New thread finished");

  • } }



Чи можна було б обійтися без введення функції Fun?

  • Чи можна було б обійтися без введення функції Fun?



Start – запускає потік;

  • Start – запускає потік;

  • Join – чекає завершення вказаного потоку;

  • Sleep – призупиняє виконання потоку на вказане число мілісекунд.



Консольне застосування, яке запускає два потоки. Вони мають ідентичну функціональність (кожний потік по двадцять разів виводить у циклі назву потоку та номер чергової ітерації), але працюють з різними швидкостями.

  • Консольне застосування, яке запускає два потоки. Вони мають ідентичну функціональність (кожний потік по двадцять разів виводить у циклі назву потоку та номер чергової ітерації), але працюють з різними швидкостями.



Створюється допоміжний клас ThreadHelper, в якому задаються параметри потоку (в т.ч. часова затримка). Визначається також функція Run, яка задає функціональність потоків, саме з нею і пов’язується делегат ThreadStart.

  • Створюється допоміжний клас ThreadHelper, в якому задаються параметри потоку (в т.ч. часова затримка). Визначається також функція Run, яка задає функціональність потоків, саме з нею і пов’язується делегат ThreadStart.

  • Звичайно, можуть бути і інші підходи.



class ThreadHelper

  • class ThreadHelper

  • {

  • public int DelayTime { get; set; }

  • public int Nomer { get; set; }

  • public void Run()

  • {

  • for (int i = 1; i <= 20; i++)

  • {

  • Console.WriteLine("Thread {0}: {1}-th pass",Nomer,i);

  • Thread.Sleep(DelayTime);

  • }

  • Console.WriteLine("Thread {0} finished", Nomer);

  • }

  • }



var th1 = new ThreadHelper { DelayTime = 100, Nomer = 1 };

  • var th1 = new ThreadHelper { DelayTime = 100, Nomer = 1 };

  • var th2 = new ThreadHelper { DelayTime = 500, Nomer = 2 };

  • Thread t1 = new Thread(new ThreadStart(th1.Run));

  • Thread t2 = new Thread(new ThreadStart(th2.Run));

  • t2.Start();

  • t1.Start();



Загальна характеристика проблеми.

  • Загальна характеристика проблеми.

  • Основні можливості – Interlocked, Monitor, Mutex.



Моделювання послідовності переведення грошей з одного рахунку до іншого; поточні рахунки зберігаються в масиві. Запускаються два потоки, кожний з яких на кожній ітерації нескінченного циклу випадковим чином вибирає два рахунки та здійснює між ними переведення: перший декрементується, другий інкрементується.

  • Моделювання послідовності переведення грошей з одного рахунку до іншого; поточні рахунки зберігаються в масиві. Запускаються два потоки, кожний з яких на кожній ітерації нескінченного циклу випадковим чином вибирає два рахунки та здійснює між ними переведення: перший декрементується, другий інкрементується.

  • На початку роботи програми є 100 рахунків; на кожному зберігається 200 умовних одиниць.

  • Основний потік виводить максимальне та мінімальне значення рахунків, а також їх суму. Зрозуміло, що при правильній роботі ця сума має бути постійною. В даній програмі це не так.



Thread t1 = new Thread(new ThreadStart(Transfer));

  • Thread t1 = new Thread(new ThreadStart(Transfer));

  • t1.Start();

  • Thread t2 = new Thread(new ThreadStart(Transfer));

  • t2.Start();

  • while (true) {

  • int S = M.Sum();

  • int max = M.Max(); int min = M.Min();

  • Console.Clear();

  • Console.WriteLine("Amount of transfers is {0}", AmountOfTransfers);

  • Console.WriteLine("Current minimum is {0}", min);

  • Console.WriteLine("Current maximum is {0}", max);

  • Console.WriteLine("Total amount is {0}", S);

  • Thread.Sleep(100); }



static void Transfer()

  • static void Transfer()

  • {

  • Random r = new Random();

  • while (true) {

  • for (int k = 0; k < 50; k++)

  • {

  • int from = r.Next(Capacity);

  • int to = r.Next(Capacity);

  • M[from]--;

  • M[to]++;

  • AmountOfTransfers++;

  • }

  • Thread.Sleep(100);

  • } }



Increment – атомарне збільшення на одиницю.

  • Increment – атомарне збільшення на одиницю.

  • Decrement – атомарне зменшення на одиницю.

  • Exchange – атомарний обмін даними.



try {

  • try {

  • Monitor.Enter(theLock);

  • критична секція

  • finally {

  • Monitor.Exit(theLock);

  • }

  • }



lock (theLock) {

  • lock (theLock) {

  • критична секція

  • }



static Object o = new object();

  • static Object o = new object();

  • lock (o)

  • {

  • S = M.Sum();

  • max = M.Max();

  • min = M.Min();

  • }



lock (o)

  • lock (o)

  • {

  • M[from]--;

  • M[to]++;

  • AmountOfTransfers++;

  • }



class Program

  • class Program

  • {

  • static void Fun() {

  • ulong counter = 0;

  • while (true)

  • {Console.Write("{0} - ", ++counter); }

  • }

  • static void Main(string[] args) {

  • Thread newThread = new Thread(new ThreadStart(Fun));

  • newThread.Start();

  • Thread.Sleep(100);

  • newThread.Abort();

  • newThread.Join();

  • } }



Метод Abort викликає виключення ThreadAbortException. Поток може певним чином перехоплювати та обробляти це виключення.

  • Метод Abort викликає виключення ThreadAbortException. Поток може певним чином перехоплювати та обробляти це виключення.

  • Наприклад:

  • catch (ThreadAbortException e)

  • {

  • Console.WriteLine(e.Message);

  • }



Обробник виключення має вигляд

  • Обробник виключення має вигляд

  • catch (ThreadAbortException)

  • {

  • Console.WriteLine("Abort!");

  • }

  • Чи буде головний потік вічно чекати завершення цього потоку?



Потік можна зробити фоновим за допомогою виклику

  • Потік можна зробити фоновим за допомогою виклику

  • thread.IsBackground=true;



class Program

  • class Program

  • {

  • static void Fun()

  • {

  • Thread.Sleep(30000);

  • Console.WriteLine("End of other thread");

  • }

  • static void Main(string[] args)

  • {

  • Thread t1 = new Thread(new ThreadStart(Fun));

  • t1.IsBackground = true;

  • t1.Start();

  • Console.WriteLine("End of main thread");

  • }

  • }



Властивість Priority.

  • Властивість Priority.

  • Можливі значення (перелічення ThreadPriority): Highest, AboveNormal, Normal, BelowNormal, Lowest.



Метод Wait – чекання.

  • Метод Wait – чекання.

  • Метод Pulse – повідомлення потоків, що чекають, про готовність віддати блокування.



Більшість типів колекцій не синхронізовано.

  • Більшість типів колекцій не синхронізовано.

  • Два способи синхронізації – властивість SyncRoot або метод Synchronized.



Основна ідея – розділення черги на запис та черги на читання.

  • Основна ідея – розділення черги на запис та черги на читання.

  • Запит на читання – AcquireReaderLock.

  • Запит на запис – AcquireWriterLock.

  • З .NET 3.5 – удосконалення: ReaderWriterLockSlim.



Ідея – викликати метод в асинхронному режимі та під час його виконання продовжувати займатися іншою роботою.

  • Ідея – викликати метод в асинхронному режимі та під час його виконання продовжувати займатися іншою роботою.

  • Використовується механізм делегатів. Методи BeginInvoke та EndInvoke.

  • Два основні підходи: просто чекати завершення роботи асинхронного методу або використати callback.



class Program {

  • class Program {

  • private delegate int AsynchDelegat(int q);

  • private static int GetAnswer(int w)

  • {

  • int r = w * w;

  • Thread.Sleep(6000);

  • return r;

  • }

  • static void Main(string[] args)

  • {

  • }

  • }



AsynchDelegat asd = new AsynchDelegat(GetAnswer);

  • AsynchDelegat asd = new AsynchDelegat(GetAnswer);

  • IAsyncResult pendingOp = asd.BeginInvoke(5, null, null);

  • Console.WriteLine("I have a lot of other work");

  • Console.WriteLine("Now we are waiting for results");

  • int result = asd.EndInvoke(pendingOp);

  • Console.WriteLine("Result is {0}", result);



Створити клас, в конструкторі якого встановити потрібні дані, а також створити екземпляр Thread.

  • Створити клас, в конструкторі якого встановити потрібні дані, а також створити екземпляр Thread.

  • В методі (наприклад, Run) задати функціональність потоку.

  • Визначити методи запуску потоку (в основі – виклик Start) та завершення (в основі – метод Join). Тісний зв’язок з асинхронними викликами.



class ThreadHelper

  • class ThreadHelper

  • {

  • private String theString;

  • private Thread theThread;

  • public ThreadHelper(String s)

  • {

  • theString = s;

  • theThread = new Thread(new ThreadStart(this.Run));

  • }



String s1 = "AAAAA";

  • String s1 = "AAAAA";

  • String s2 = "BBBBB";

  • ThreadHelper t1 = new ThreadHelper(s1);

  • ThreadHelper t2 = new ThreadHelper(s2);

  • t1.BeginProcessing();

  • t2.BeginProcessing();

  • Console.WriteLine("Doing something else...");

  • t2.EndProcessing();

  • t1.EndProcessing();



Unstarted

  • Unstarted

  • Running

  • Suspended

  • SuspendRequested

  • WaitSleepJoin

  • AbortRequested

  • Finished/Aborted



Схожі:

В c# в межах однієї програми може бути запущено декілька потоків в c# в межах однієї програми може бути запущено декілька потоків iconОдин мультипроцесор може одночасно виконувати 1024 програмних потоків(ниток). Але виконавчих пристроїв всього Тому інструкції всіх 1024 потоків в один момент виконуватися не можуть
Тому інструкції всіх 1024 потоків в один момент виконуватися не можуть. Нитки розбиті на групи по 32 штуки, так звані warp. В один...
В c# в межах однієї програми може бути запущено декілька потоків в c# в межах однієї програми може бути запущено декілька потоків iconУ формі буклету виготовляються путівники, проспекти, програми концертів і вистав, реклами продукції та послуг тощо
На кожній сторінці може бути кілька статей. Матеріал статей розміщується в кілька колонок. Кожна колонка це напис, який у Publisher...
В c# в межах однієї програми може бути запущено декілька потоків в c# в межах однієї програми може бути запущено декілька потоків iconЛ12 Цифрові вимірювальні прилади
Вся електроніка в основному працює з електричними сигналами, Аналоговий сигнал може приймати будь-які значення в певних межах (наприклад,...
В c# в межах однієї програми може бути запущено декілька потоків в c# в межах однієї програми може бути запущено декілька потоків iconПотоки (threads) підтримка багатопоточності на рівні самої мови
В одній програмі можна запустити декілька потоків, які будуть працювати паралельно
В c# в межах однієї програми може бути запущено декілька потоків в c# в межах однієї програми може бути запущено декілька потоків iconУгода про розподіл продукції Угода про розподіл продукції
Угода про розподіл продукції може бути двосторонньою чи багатосторонньою, тобто її учасниками можуть бути декілька інвесторів, за...
В c# в межах однієї програми може бути запущено декілька потоків в c# в межах однієї програми може бути запущено декілька потоків iconУрок №12 Використання системних утиліт На уроці ми навчимось: встановлювати й видаляти програми за допомогою спеціальних засобів, що надаються операційною системою
Далі у діалоговому вікні Запуск програми установки потрібно клацнути кнопку Готово, після чого буде запущено програму-інсталятор....
В c# в межах однієї програми може бути запущено декілька потоків в c# в межах однієї програми може бути запущено декілька потоків icon1 приватне підприємство 1 приватне підприємство
Це повноправна юридична особа. Його засновниками, згідно чинного законодавства може бути як одна особа, так і декілька
В c# в межах однієї програми може бути запущено декілька потоків в c# в межах однієї програми може бути запущено декілька потоків iconПрограма InstallShield Express
У наш час сучасні програми розповсюджуються на компакт-дисках. Проте інсталяційна програма може бути створена так само, як І люба...
В c# в межах однієї програми може бути запущено декілька потоків в c# в межах однієї програми може бути запущено декілька потоків iconЗавдання з вибором однієї правильної відповіді. Завдання з вибором однієї правильної відповіді
До кожного завдання подано декілька варіантів відповіді, з яких лише один правильний
В c# в межах однієї програми може бути запущено декілька потоків в c# в межах однієї програми може бути запущено декілька потоків iconAsp net 2010 Зміст
Тривалість етапів може бути різною, навіть при роботі з однією сторінкою. Зокрема, валідація спряжена з викликом методу Validate...

Додайте кнопку на своєму сайті:
dok.znaimo.com.ua


База даних захищена авторським правом ©dok.znaimo.com.ua 2013
звернутися до адміністрації
dok.znaimo.com.ua
Головна сторінка