// "Для вас выполнено " +

 // numberCalculationsToFar.ToString +

 // " расчетов!");

}

Листинг 9.5. Код класса FindNextPrimeNumber.cs

using System;

public class FindNextPrimeNumber {

 //Перечисляем возможные состояния

 public enum ProcessingState {

  notYetStarted,

  waitingToStartAsync,

  lookingForPrime,

  foundPrime,

  requestAbort,

  aborted

 }

 long m_startPoint;

 long m_NextHighestPrime;

 //Поиск какого количества элементов выполнен?

 long m_comparisonsSoFar;

 //Для какого элемента сейчас выполняется поиск простого числа?

 long m_CurrentNumberBeingExamined;

 //Вызывается для обновления информации о состоянии выполнения

 public void getExecutionProgressInfo(out long numberCalculationsSoFar, out long currentItemBeingLookedAt) {

  //ПРИМЕЧАНИЕ. Мы используем блокирование потока для уверенности в том,

  //что эти значения не считываются во время выполнения операции

  //их записи. Поскольку доступ к m_comparisonsSoFar

  //и m_CurrentNumberBeingExamined могут осуществлять

  //одновременно несколько потоков, любая выполняемая над ними

  //операция записи/считывания должна синхронизироваться с "блокировкой",

  //что будет гарантировать "атомарность" этих операций

  lock (this) {

   numberCalculationsSoFar = m_comparisonsSoFar;

   currentItemBeingLookedAt = m_CurrentNumberBeingExamined;

  }

 }

 ProcessingState m_processingState;

 //---------------------------

 //Простейший конечный автомат

 //---------------------------

 public void setProcessingState(ProcessingState nextState) {

  //------------------------------------------------------

  //Простейший защитный код, гарантирующий

  //невозможность перехода в другое состояние, если задача

  //либо успешно завершена, либо успешно отменена

  //------------------------------------------------------

  if ((m_processingState == ProcessingState.aborted) ||

      (m_processingState == ProcessingState.foundPrime)) {

   return;

  }

  //Разрешить изменение состояния

  m_processingState = nextState;

 }

 public ProcessingState getProcessingState {

  get {return m_processingState;}

 }

 //------------------------

 //Возвращает простое число

 //------------------------

 public long getPrime {

  if (m_processingState != ProcessingState.foundPrime) {

   throw new Exception("простое число еще не найдено!");

  }

  return m_NextHighestPrime;

 }

 //Конструктор класса

 public FindNextPrimeNumber(long startPoint) {

  setProcessingState(ProcessingState.notYetStarted);

  m_startPoint = startPoint;

 }

 //-----------------------------------------------------------

 //Создает новый рабочий поток, который будет вызывать функцию

 // "findNextHighestPrime"

 //-----------------------------------------------------------

Перейти на страницу:

Похожие книги