Створення потоку, що має стан в Visual C # (Sharp)

У попередньому прикладі потоки не управляли ніяким станом У більшості ж випадків потоки звертаються до якого-небудь стану Використання відбудеться в контексті анонімних методів і лямбда-виразів представляє собою складну задачу (Подробиці про управління станом за допомогою лямбдираженій см в главі 11)

Реалізація делегата Threadstart

Одним із способів виконання потоку, що має стан, буде визначення типу, який реалізує делегат типу Threadstart У наступному прикладі опредяется клас з методом, який буде викликаний потоком Вживаний метод варто в передачі типу Thread класичного делегата типу NET 1 Х

class ThreadedTask { string _whatToSay

public ThreadedTask(string whatosay) {

_whatToSay = whatosay

}

public void MethodToRun() {

ConsoleWriteLine(&quotI am babbling (&quot + _whatToSay + &quot)&quot)

}

}

Щоб використовувати метод, потоковий код модифікується в такий спосіб:

ThreadedTask task = new ThreadedTask)&quothello&quot)

Thread thread = new Threadfnew Threadstart(taskMethodToRun)) threadStart()

У прикладі створюється екземпляр типу ThreadedTask, який має стан, пле чого допомогою методу statefuitaskMethodToRunо створюється екземпляр Thread При виконанні потоку з членом даних _whatToSay буде асоційоване певний стан Цей код повністю логічний і не містить ніяких сюрізов Але що буде, якщо працюючий з станами метод викликати двічі, як показано в наступному коді

ThreadedTask task = new ThreadedTask(&quothello&quot)

Thread threadl = new Thread(new Threadstart(taskMethodToRun)) Thread thread2 = new Thread(new Threadstart(taskMethodToRun)) threadlStart()

thread2Start()

У даному випадку ми маємо два примірники Thread, але один примірник завдання Обидва ці примірника будуть робити одне і те ж що ще гірше – вони обидва будуть раелять одне і те ж стан У той час як поділ стану в принципі не є нічим забороненим, робити це необхідно особливим чином, щоб забезпечити цілісність стану Тому потрібно для кожного екземпляра Thread створити і асоціювати з ним свій екземпляр ThreadedTask, як показано в слующем коді:

ThreadedTask taskl = new ThreadedTask(&quothello&quot) ThreadedTask task2 = new ThreadedTask(&quotgoodbye&quot)

Thread threadl = new Thread(new Threadstart(tasklMethodToRun)) Thread thread2 = new Thread(new Threadstart(task2MethodToRun)) threadlStart()

thread2Start()

Таким чином, при виконанні методу, що працює з станом, необхідно асоціювати з кожним екземпляром потоку свій екземпляр завдання Це означає, що в такому випадку ми не може використовувати анонімні підставляються в коді (in-line) методи, які звертаються до стану Замість цього потрібно іспользать рішення, показане врозд Використання лямбда-виразів в електро таблиці глави 11

Використання параметрів потоку

Припустимо, що ми хочемо використовувати підставляється анонімний метод або лямбда-вираз, а також потік з станом Це можна зробити за допомогою параметрів потоку Параметри потоку подібні параметрам методу, тільки дані передаються екземпляру потоку, і його можна розглядати, як конструктор поту Далі наводиться приклад параметра потоку:

Thread thread = new Thread(

(buffer) =&gt { ConsoleWriteLine(&quotYou said (&quot + bufferToString() + &quot)&quot)

})

threadStart(&quotmy text&quot)

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

На використання параметрів потоку накладаються два обмеження: можна педавать тільки один параметр і цей параметр повинен бути обєктом

ПРИМІТКА

Хоча можливість передавати лише один параметр і являє незручність, це все-таки краще, ніж жодного Але те, що цей параметр повинен бути обєктом, не зовсім зрозуміло, т к у нас є узагальнення NET Проте, такі обмежені на використання параметрів потоку, і з ними треба рахуватися

Джерело: Гросс К С # 2008: Пер з англ – СПб: БХВ-Петербург, 2009 – 576 е: ил – (Самовчитель)

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*