Створення додаткових потоків в .NET Framework 4.0

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

thumbnail

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

Отже створіть консольну програму, яка буде використовувати .NET Framework 4.0 та добавте до списку просторів імен наступне значення: using System.Threading

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace MultiThreadApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            ThreadStart threadDelegate = new ThreadStart(ReadDataFromDB);
            Thread newThread = new Thread(threadDelegate);
            newThread.Start();
            AnotherWork();
            Console.ReadLine();
        }
        private static void ReadDataFromDB()
        {
            Thread.Sleep(20000);
            Console.WriteLine("Data was read");
        }
        private static void AnotherWork()
        {
            Console.WriteLine("Another work has just accomplished");
        }
    }
}

В наведеному коді створено два методи: ReadDataFromDB та AnotherWork. Перший з них створює ілюзію затримки, присипаючи поток, який його викликав, використовуючи статичний метод Thread.Sleep. Другий просто виводить інформацію на екран, яка ідентифікує, що певна робота була зроблена.

На початку метода Main створюється делегат, який вказує на метод ReadDataFromDB, і який ми передаємо в конструктор класу Thread, тобто цим ми вказуємо екземпляру класу Thread, що він повинен буде запустити метод ReadDataFromDB. Для того, щоб запустити цей поток, ми використовуємо екземплярний метод Start.

Запустивши цю програму, ми отримаємо на екрані такі дані:

clip_image002

В нашій програмі видно, що виконався спочатку метод AnotherWork(), після якого через 20 секунд виконався ReadDataFromDB(), тобто в нас було в програмі два потока Smile.

Також конструктор класу Thread має перевантаження, яке приймає екземпляр делегату ParameterizedThreadStart:

     ParameterizedThreadStart paramDel = new ParameterizedThreadStart(ReadCustomerData);
     Thread anotherThread = new Thread(paramDel);
     anotherThread.Start(5);
     private static void ReadCustomerData(object customerId)
     {
         Thread.Sleep(5000);
         Console.WriteLine("Customer data was read");
     }

В цьому коді я створив екземпляр цього делегату, якому передав метод ReadCustomData, який приймає один параметр – будь-який клас, який унаслідується від класу Object.

Запустив я цей метод знову викликавши метод Start, якому на цей раз передав значення “5”.

В певний момент часу, ми маємо можливість призупинити поток або взагалі зупинити:

ThreadStart threadDelegate = new ThreadStart(ReadDataFromDB);
Thread newThread = new Thread(threadDelegate);
newThread.Start();
newThread.Abort();

В даному коді ми стартуємо поток і відразу його “вбиваємо”.
Нагадую, що операція створення потоку є трудомісткою, тому рекомендую більше використовувати засоби, про які я розповім в наступних статтях. Дякую за увагу Smile!

Advertisements

, , ,

  1. Leave a comment

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

%d bloggers like this: