Главная » Silverlight » Создание рабочего класса

0

Рассмотрим пример, в котором приложение вычисляет простые числа в заданном диапазоне методом просеивания. Другое название метода — решето Эратосфена (древ­негреческий математик Эратосфен изобрел его приблизительно в 240 году до нашей эры). Сначала код создает список всех целых чисел в заданном диапазоне. Затем из списка удаляются числа, кратные простым числам, которые меньше квадратного корня максимального числа или равны ему. Оставшиеся числа являются простыми.

Мы не будем касаться теории, доказывающей работоспособность алгоритма. Приведем лишь простой код, реализующий его. Также не пытайтесь оптимизировать код или сравнить его с другими методами. Наша задача сейчас — реализовать алгоритм Эратосфена в фоновом потоке.

Полный код класса FindPrimesThreadWrapper можно найти в примерах, загружае­мых для данной главы. Как и любой класс, производный от ThreadWrapperBase, класс FindPrimesThresdWrapper должен содержать четыре компонента.

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

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

•       Переопределенный метод DoTaskO , в котором фактически реализован алгоритм Эратосфена. В методе используются начальные данные, а результаты работы ме­тода записываются в поле класса.

•       Переопределенный метод OnCompleted (), который генерирует событие завер­шения. Обычно событие завершения предоставляет объект типа EventArgs, содержащий результирующие данные. В рассматриваемом примере класс FindPrimesCompletedEventArgs содержит значения, определяющие диапазон и массив простых чисел.

Ниже приведен код класса FindPrimesThreadWrapper.

public class FindPrimesThreadWrapper : ThreadWrapperBase {

// Хранение входной и выходной информации private int fromNumber, toNumber; private int[] primeList;

public FindPrimesThreadWrapper (int from, int to) {

this.fromNumber = from; this.toNumber = to;

}

protected override void DoTaskO {

II Здесь находится код, вычисляющий массив простых чисел II (см. загружаемый код примера)

}

public event EventHandler<FindPrimesCompletedEventArgs>

Completed; protected override void OnCompleted() f

// Генерация события завершения if (Completed != null) Completed(this, •new FindPrimesCompletedEventArgs (fromNumber, toNumber, primeList));

)

}

Важно отметить, что данные, используемые в классе FindPrimesThreadWrapper (зна­чения границ диапазона и массив простых чисел), не предоставляются открыто. Это предотвращает обращение к ним из главного потока приложения во время работы фо­нового потока. Если необходимо сделать массив простых чисел доступным, лучше всего добавить в код открытое свойство, проверяющее значение свойства ThreadWrapperBase. State и заполняемое по завершении потока.

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

Примечание. Если нужно предоставить один и тот же объект двум потокам, в которых он будет использоваться одновременно, необходимо защитить доступ к объекту средствами блокировки. Как и в полнофункциональном приложении .NET, для получения монопольного доступа к объекту, находящемуся в памяти, используется ключевое слово lock. Однако блокировка усложняет приложение и может породить ряд проблем. Производительность приложения ухудшается, потому что другие потоки, пытающиеся обратиться к объекту, должны ждать снятия блокировки. Кроме того, может возникнуть взаимоблокировка, когда два потока пытаются заблокировать один и тот же объект.

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

По теме:

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