(готовый класс, .NET 2.0) lae.Synchronization.Task

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

_ae_
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 165
Зарегистрирован: 08.10.2006 (Вс) 14:37

(готовый класс, .NET 2.0) lae.Synchronization.Task

Сообщение _ae_ » 04.11.2006 (Сб) 19:55

Данный класс позволяет запускать задания(процедуры) через определенный промежуток времени.
Задания выполняются в фоновом режиме, ожидание времени может быть прервано в любой момент.
Само задание представляет из себя процедуру, принимающую в качестве аргумента переменную типа object.
Методы:
Start(nDuration). Запускает цикл с таймером.
Stop. Если поток не выполняет задание, останавливает цикл с таймером. Если поток в данный момент выполняет задание, ждет WaitForAbortTimeout милисекунд, после чего принудительно завершает поток с заданием(если задать WaitForAbortTimeout=-1 то принудительного заврешения не будет).
ErrorHandler. Если это свойство задано, то процедура, указанная в нем вызывается в случае если выполнение задания завершается ошибкой.

Код:
Код: Выделить всё
Namespace lae.Synchronization
    Public Class Task
        Public Delegate Sub TaskSub(ByVal nObject As Object)
        Public Delegate Sub ErrorHandlerSub(ByVal nException As Exception, ByVal nTask As TaskSub, ByVal nTaskObject As Object)

        Dim mTask As TaskSub
        Dim mTaskObject As Object
        Dim mDuration As UInteger
        Dim mThread As New Threading.Thread(AddressOf ThrdRoutine)
        Dim mCleanAbortEvent As New Threading.ManualResetEvent(False)
        Dim mLockObject As New Object
        Dim mErrorHandler As ErrorHandlerSub
        Public WaitForAbortTimeout As Integer = 10000

        Public Sub New(ByVal nTask As TaskSub, ByVal nTaskObject As Object)
            'Важно! В дальнейщем эти объекты(Task и TaskObject уже не должны меняться)
            If nTask Is Nothing Then
                Throw New ArgumentNullException
            Else
                mTask = nTask
                mTaskObject = nTaskObject
                mThread.Priority = Threading.ThreadPriority.BelowNormal
            End If
        End Sub

        Public Sub Start(ByVal nDuration As UInteger)
            If nDuration < 100 Then Throw New ArgumentException
            SyncLock mLockObject
                If mDuration = 0 Then
                    mDuration = nDuration
                    mThread.Start()
                Else
                    Throw New InvalidOperationException
                End If
            End SyncLock
        End Sub

        Public Sub [Stop]()
            SyncLock mLockObject
                If mDuration = 0 Then Exit Sub
                mCleanAbortEvent.Set()
                If Not mThread.Join(WaitForAbortTimeout) Then
                    mThread.Abort()
                End If
                mDuration = 0
                mCleanAbortEvent.Reset()
            End SyncLock
        End Sub

        Private Sub ThrdRoutine()
            Do
                If mCleanAbortEvent.WaitOne(mDuration, False) Then
                    Return
                End If
                Try
                    mTask(mTaskObject)
                Catch ex As Exception
                    Dim nErrorHandler As ErrorHandlerSub = mErrorHandler
                    If Not nErrorHandler Is Nothing Then
                        nErrorHandler(ex, mTask, mTaskObject)
                    End If
                End Try
            Loop
        End Sub

        Public Property ThreadPriority() As Threading.ThreadPriority
            Get
                Return mThread.Priority
            End Get
            Set(ByVal value As Threading.ThreadPriority)
                mThread.Priority = value
            End Set
        End Property

        Public Property ErrorHandler() As ErrorHandlerSub
            Get
                Return mErrorHandler
            End Get
            Set(ByVal value As ErrorHandlerSub)
                mErrorHandler = value
            End Set
        End Property
    End Class
End Namespace

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 04.11.2006 (Сб) 23:35

В Кирпичи?

Neco
Новичок
Новичок
 
Сообщения: 29
Зарегистрирован: 06.07.2005 (Ср) 1:21

Сообщение Neco » 08.11.2006 (Ср) 1:04

никакой защиты от кростредов. хорошо, если на визульной компоненте произойдёт - сразу вылезет понятная ошибка. а если нет? прога будет сбоить непонятно почему и в разных местах с разным интервалом - от часа до месяца...
такие вещи надо реализовывать, имхо, через хрень asycmanager что ли называется. я одно время на неё надежды возлагал большие, но потом понял, что в принципе многопточные приложения надо проектировать с умом - и тогда и у юзера трабл не будет с подвисонами и у прогера проблем с доступом к ресурсам.

_ae_
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 165
Зарегистрирован: 08.10.2006 (Вс) 14:37

Сообщение _ae_ » 08.11.2006 (Ср) 13:36

никакой защиты от кростредов
Подробнее.
прога будет сбоить непонятно почему и в разных местах с разным интервалом - от часа до месяца
И здесь в особенности.


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 99

    TopList