Иво Салмре

Книги → Программирование мобильных устройств на платформе .NET Compact Framework → Примеры к главе 9 (производительность и многопоточное выполнение)

 If (m_processingState <> ProcessingState.aborted) Then

  'Обозначить завершение выполнения

  setProcessingState(ProcessingState.done)

 End If

 'Выйти из потока...

End Sub

'----------------

'Конечный автомат

'----------------

Public Sub setProcessingState(ByVal nextState As _

 ProcessingState)

 'В любой момент времени только одному потоку выполнения могут быть

 'разрешены попытки изменить состояние

 SyncLock (m_useForStateMachineLock)

  'В случае попытки повторного вхождения в текущее состояние

  'никакие дополнительные действия не выполняются

  If (m_processingState = nextState) Then

   Return

  End If

  '-----------------------------------------------------------

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

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

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

  '-----------------------------------------------------------

  If ((m_processingState = ProcessingState.aborted) OrElse _

   (m_processingState = ProcessingState.done)) Then

   Return

  End If

  'Убедиться в допустимости данного изменения состояния

  Select Case (nextState)

  Case ProcessingState.notYetStarted

   Throw New Exception _

    ("Переход в состояние 'notYetStarted' невозможен")

  Case ProcessingState.waitingToStartAsync

   If (m_processingState <> ProcessingState.notYetStarted) Then

    Throw New Exception("Недопустимое изменение состояния")

   End If

  Case ProcessingState.running

   If (m_processingState <> _

    ProcessingState.waitingToStartAsync) Then

    Throw New Ехсерtion("Недопустимое изменение состояния")

   End If

  Case ProcessingState.done

   'Мы можем завершить работу лишь тогда, когда она выполняется.

   'Это возможно также в тех случаях, когда пользователь затребовал

   'отмену выполнения, но работа к этому моменту уже была закончена

   If ((m_processingState <> ProcessingState.running) AndAlso _

    (m_processingState <> ProcessingState.requestAbort)) Then

    Throw New Exception("Недопустимое изменение состояния")

   End If

  Case ProcessingState.aborted

   If (m_processingState <> ProcessingState.requestAbort) Then

    Throw New Exception("Недопустимое изменение состояния")

   End If

  End Select

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

  m_processingState = nextState

 End SyncLock

End Sub

Public ReadOnly Property State() As ProcessingState

 Get

  Dim currentState As ProcessingState

  'Предотвратить попытки одновременного чтения/записи состояния

  SyncLock (m_useForStateMachineLock)

   currentState = m_orocessingState

  End SyncLock

  Return currentState

 End Get

End Property

End Class

Option Strict On

Imports System

'---------------------------------------------------------

'Тестовый код, который используется для выполнения фоновым

← предыдущая следующая →

Страницы раздела: 1 2 3 4 5 6 7

Публикация компанией Dropbox кода Zulip – средства общения для IT-разработчиков

20.11.2015
Одной из одобрительно встреченных программистами инициатив, реализующихся в рамках акции Hack Week, стала публикация исходного кода приложения Zulip – веб-приложения для общения между собой разработчиков в сфере IT-технологий.

Объединение ОС Android и Chrome

17.11.2015
Слухи об объединении двух крупнейших ОС компании Google, Android и Chrome, гуляют по Интернету уже более 5 лет, но до сих пор этого не случилось, хотя очевидно, что с течением времени эти ОС становятся всё более похожими: так, в последнее время появилось немало Android-устройств, к которым прилагаются клавиатуры, а Chrome OS «научилась» работать с сенсорными экранами.

Конференция Linux Piter 2015

15.11.2015
Уже почти через неделю в Санкт-Петербурге впервые в истории пройдёт конференция, посвящённая проблемам свободного программного обеспечения – Linux Piter 2015.