Главная » Silverlight » Использование оболочки потока

0

Рис. 19.1. Список простых чисел

«

В момент щелчка приложение отключает кнопку cmdFind (на ней написано Найти простые числа), чтобы предотвратить создание нескольких потоков. В принципе, это возможно, но сбивает с толку пользователя. Затем приложение извлекает значения границ диапазона, создает объект FindPrimesThreadWrapper, подключает обработчик к событию Completed и вызывает метод Start О , чтобы начать вычисление.

private FindPrimesThreadWrapper threadWrapper;

private void cmdFind_Click(object sender, RoutedEventArgs e)

Рассмотрим приложение Silverlight, в котором используется класс FindPrimes- ThreadWrapper (рис. 19.1). Пользователь задает диапазон. При щелчке на кнопке Найти простые числа начинается выполнение фонового потока. Когда вычисление заканчива­ется, список простых чисел выводится в элемент DataGrid.

// Отключение кнопки и очистка полей

//от предыдущего результата cmdFind.IsEnabled = false; gridPrimes.ItemsSource = null;

// Извлечение границ диапазона int from, to;

if (!Int32.TryParse(txtFrom.Text, out from)) {

lblStatus.Text = "Неправильная нижняя граница."; return;

)

if (!Int32.TryParse(txtTo.Text, out to) )

{

lblStatus.Text = "Неправильная верхняя граница."; return;

}

// Запуск потока

threadWrapper = new FindPrimesThreadWrapper(from, to); threadWrapper.Completed += threadWrapper_Completed; threadWrapper.Start() ;

lblStatus.Text = "Выполняется поиск…";

}

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

По завершении задачи генерируется событие Completed, в результате чего список извлекается из класса и выводится в решетку.

private void threadWrapper_Completed(object sender, FindPrimesCompletedEventArgs e)

{

FindPrimesThreadWrapper thread = (FindPrimesThreadWrapper)sender;

this.Dispatcher.Beginlnvoke(delegate() {

if (thread.Status == StatusState.Completed) {

int[] primes = e.PrimeList;

lblStatus.Text = "Найдено " + primes.Length +

" простых чисел."; gridPrimes.ItemsSource = primes;

}

cmdFind.IsEnabled = true;

) ;

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

По теме:

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