Главная » Silverlight » Создание оболочки потока

0

В предыдущих примерах продемонстрировано обновление пользовательского интер­фейса непосредственно в фоновом потоке. Однако такой подход не идеален. При его ис­пользовании создается запутанный код, в котором рабочие операции перемешаны с вы­водом данных. В результате приложение получается сложным и негибким. Его тяжело обновлять. Например, если в предыдущем примере понадобится изменить имя тексто­вого поля или заменить его другим элементом управления, то, кроме кода интерфейса, придется редактировать также код потока.

Лучший подход состоит в создании потока, который передает информацию обратно в главный поток и предоставляет приложению возможность самому позаботиться о вы­воде информации на экран. Чтобы облегчить реализацию такого подхода, код потока и данные обычно заключают в отдельный класс. В него можно добавить свойства специ­ально для ввода и вывода информации. Такой пользовательский класс называется обо­лочкой потока.

Перед созданием оболочки рекомендуется переместить все операции потока в базо­вый класс. Тогда можно будет использовать один и тот же шаблон кода для решения многих задач, не создавая повторно один и тот же код.

Рассмотрим базовый класс оболочки ThreadWrapperBase. Это абстрактный класс, поэтому создать его экземпляр нельзя. Вместо этого нужно создать производный класс.

public abstract class ThreadWrapperBase

{ … }

Класс ThreadWrapperBase определяет два открытых свойства. Свойство Status возвращает один из трех элементов перечисления: Unstarted (Не начат), InProgress (Выполняется) и Completed (Завершен).

// Отслеживание статуса задачи

private StatusState status = StatusState.Unstarted;

public StatusState Status

{

get { return status; }

Класс ThreadWrapperBase является оболочкой объекта Thread и предоставляет метод Start (), который создает и запускает поток.

// Это поток, в котором выполняется задача private Thread thread;

// Запуск новой операции

public void Start () {

if (status == StatusState.InProgress)

{

throw new InvalidOperationException("Уже выполняется.");

}

else

{

// Инициализация новой задачи status = StatusState.InProgress;

// Создание потока в фоновом режиме, чтобы он // был автоматически закрыт при завершении приложения thread = new Thread(StartTaskAsync); thread.IsBackground = true;

// Запуск потока thread.Start();

}

}

Поток выполняет закрытый метод StartTaskAsync (), который передает задачу двум другим методам: DoTask (.) и OnCompleted О . Вся работа (в данном примере — вы­числение простых чисел) выполняется методом DoTask (). Метод OnCompleted () гене­рирует событие завершения или выполняет обратный вызов для извещения клиента. Содержимое упомянутых операций зависит от решаемых задач, поэтому оба метода реализованы как абстрактные, т.е. переопределяемые в производном классе.

private void StartTaskAsync()

{

DoTask ();

status = StatusState.Completed;

OnCompleted();

}

// Переопределите эти методы protected abstract void DoTask(); protected abstract void OnCompleted();

Теперь осталось создать производный класс, в котором используются упомянутые методы. В следующих разделах рассматривается практический пример оболочки, реа­лизующей алгоритм вычисления простых чисел.

Источник: Мак-Дональд, Мэтью. Silverlight 3 с примерами на С# для профессионалов. : Пер. с англ. —- М. : ООО «И.Д. Вильяме», 2010. — 656 с. : ил. — Парал. тит. англ.

По теме:

  • Комментарии