Guten Abend
Für ein Programm an welchem ich momentan in meiner Firma arbeite benötige ich eine kleine Starthilfe.
Und zwar geht es um das erstellen eines Task-Handlers. Also ein Programm welches eine Reihe von Tasks dynamisch laden kann, und dann die Aufgaben parallel verarbeitet sowie die Resultate entgegennimmt und sie auswertet.
Ausserdem sollen Tasks oder Aufgaben so konfiguriert werden, dass man Abhängigkeiten angeben kann. Zum Beispiel darf Vorgang bzw. Task 3 erst starten, wenn der Vorgang 1 beendet ist, während Vorgang 1,2 und 4 parallel laufen können.
Die Tasks tauschen durch ein dynamisches Objekt Daten miteinander aus, welches wohl mit SyncLock durch gleichzeitiges schreiben geschützt werden muss.
Ich habe mir das ungefähr so vorgestellt:
Also um das zu verdeutlichen: Ich will ein Userinterface erstellen wo man zur Laufzeit eine Dll (In der Dll ist der DynamicDatatype der beliebig aussehen kann, und mehrere Tasks die das Interface ITaskStep implementieren) laden kann mit Reflection. Das Userinterface erstellt einen Task-Handler und dem werden die Tasks (Welche ja durch das ITaskStep-Interface definiert sind) mitgegeben. Der Taskhandler startet alle Tasks, wobei er schaut welche Tasks Vorgänger haben und die erst dann startet wenn die Vorgänger fertig sind.
Wie soll ich am besten so einen Task-Handler bauen?
PS: Hab mich mit der Task Scheduler Klasse auseinandergesetzt, war aber nicht sehr passend meiner Meinung nach.
Für ein Programm an welchem ich momentan in meiner Firma arbeite benötige ich eine kleine Starthilfe.
Und zwar geht es um das erstellen eines Task-Handlers. Also ein Programm welches eine Reihe von Tasks dynamisch laden kann, und dann die Aufgaben parallel verarbeitet sowie die Resultate entgegennimmt und sie auswertet.
Ausserdem sollen Tasks oder Aufgaben so konfiguriert werden, dass man Abhängigkeiten angeben kann. Zum Beispiel darf Vorgang bzw. Task 3 erst starten, wenn der Vorgang 1 beendet ist, während Vorgang 1,2 und 4 parallel laufen können.
Die Tasks tauschen durch ein dynamisches Objekt Daten miteinander aus, welches wohl mit SyncLock durch gleichzeitiges schreiben geschützt werden muss.
Ich habe mir das ungefähr so vorgestellt:
VB.NET-Quellcode
- Imports GenericTest
- 'Wird in einer DLL geliefert.
- Namespace GenericTaskstepInterface
- Public Interface ITaskStep
- ReadOnly Property TaskId As UInt16
- Function Execute(obj As Object) As Boolean 'as TaskResult
- End Interface
- Public Class TaskResult
- 'public Property ........
- 'public bla...
- End Class
- 'usw.
- End Namespace
- 'Ebenfalls eine DLL
- Namespace SpecificProjekt
- ''' <summary>
- ''' Von diesem Datentyp welcher immer gleich heisst wird über Reflection eine Instanz erzeugt.
- ''' Diese Eigenschaften bzw. Methoden können sich von Projekt zu Projekt unterscheiden.
- ''' </summary>
- ''' <remarks></remarks>
- Public Class DynamicDataType
- Public Function RebootDevice() As Boolean
- 'return SshConnection.Send("reboot && ifconfig eth0 down").Result = SshConnection.ResultStates.Success
- End Function
- Public Property TestPropertyBool As Boolean
- Public Property TestPropertyString As String
- End Class
- ''' <summary>
- ''' Beispiel Task
- ''' Es werden 2 Properties gesetzt und das "Zielgerät" wird neugestartet.
- ''' Dieser Task hat die ID 0
- ''' </summary>
- ''' <remarks></remarks>
- Public Class MyTask0 : Implements GenericTaskstepInterface.ITaskStep
- Private Const MY_TASK_ID As UInt16 = 0
- Public Function Execute(obj As Object) As Boolean Implements GenericTaskstepInterface.ITaskStep.Execute
- Dim dataObject As DynamicDataType = DirectCast(obj, DynamicDataType)
- dataObject.TestPropertyBool = True
- dataObject.TestPropertyString = String.Empty
- Return dataObject.RebootDevice()
- End Function
- Public ReadOnly Property TaskId As UShort Implements GenericTaskstepInterface.ITaskStep.TaskId
- Get
- Return MY_TASK_ID
- End Get
- End Property
- End Class
- ''' <summary>
- ''' Beispiel Task
- ''' Es werden 2 Properties gesetzt und das "Zielgerät" wird neugestartet.
- ''' Dieser Task hat die ID 1
- ''' </summary>
- ''' <remarks></remarks>
- Public Class MyTask1 : Implements GenericTaskstepInterface.ITaskStep
- Private Const MY_TASK_ID As UInt16 = 1
- Public Function Execute(obj As Object) As Boolean Implements GenericTaskstepInterface.ITaskStep.Execute
- Dim dataObject As DynamicDataType = DirectCast(obj, DynamicDataType)
- dataObject.TestPropertyBool = False
- dataObject.TestPropertyString = "NOT EMPTY"
- Return dataObject.RebootDevice()
- End Function
- Public ReadOnly Property TaskId As UShort Implements GenericTaskstepInterface.ITaskStep.TaskId
- Get
- Return MY_TASK_ID
- End Get
- End Property
- End Class
- End Namespace
Also um das zu verdeutlichen: Ich will ein Userinterface erstellen wo man zur Laufzeit eine Dll (In der Dll ist der DynamicDatatype der beliebig aussehen kann, und mehrere Tasks die das Interface ITaskStep implementieren) laden kann mit Reflection. Das Userinterface erstellt einen Task-Handler und dem werden die Tasks (Welche ja durch das ITaskStep-Interface definiert sind) mitgegeben. Der Taskhandler startet alle Tasks, wobei er schaut welche Tasks Vorgänger haben und die erst dann startet wenn die Vorgänger fertig sind.
Wie soll ich am besten so einen Task-Handler bauen?
PS: Hab mich mit der Task Scheduler Klasse auseinandergesetzt, war aber nicht sehr passend meiner Meinung nach.