Task-Handler (Dynamisch)

  • VB.NET
  • .NET (FX) 4.5–4.8

    Task-Handler (Dynamisch)

    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:





    VB.NET-Quellcode

    1. Imports GenericTest
    2. 'Wird in einer DLL geliefert.
    3. Namespace GenericTaskstepInterface
    4. Public Interface ITaskStep
    5. ReadOnly Property TaskId As UInt16
    6. Function Execute(obj As Object) As Boolean 'as TaskResult
    7. End Interface
    8. Public Class TaskResult
    9. 'public Property ........
    10. 'public bla...
    11. End Class
    12. 'usw.
    13. End Namespace
    14. 'Ebenfalls eine DLL
    15. Namespace SpecificProjekt
    16. ''' <summary>
    17. ''' Von diesem Datentyp welcher immer gleich heisst wird über Reflection eine Instanz erzeugt.
    18. ''' Diese Eigenschaften bzw. Methoden können sich von Projekt zu Projekt unterscheiden.
    19. ''' </summary>
    20. ''' <remarks></remarks>
    21. Public Class DynamicDataType
    22. Public Function RebootDevice() As Boolean
    23. 'return SshConnection.Send("reboot && ifconfig eth0 down").Result = SshConnection.ResultStates.Success
    24. End Function
    25. Public Property TestPropertyBool As Boolean
    26. Public Property TestPropertyString As String
    27. End Class
    28. ''' <summary>
    29. ''' Beispiel Task
    30. ''' Es werden 2 Properties gesetzt und das "Zielgerät" wird neugestartet.
    31. ''' Dieser Task hat die ID 0
    32. ''' </summary>
    33. ''' <remarks></remarks>
    34. Public Class MyTask0 : Implements GenericTaskstepInterface.ITaskStep
    35. Private Const MY_TASK_ID As UInt16 = 0
    36. Public Function Execute(obj As Object) As Boolean Implements GenericTaskstepInterface.ITaskStep.Execute
    37. Dim dataObject As DynamicDataType = DirectCast(obj, DynamicDataType)
    38. dataObject.TestPropertyBool = True
    39. dataObject.TestPropertyString = String.Empty
    40. Return dataObject.RebootDevice()
    41. End Function
    42. Public ReadOnly Property TaskId As UShort Implements GenericTaskstepInterface.ITaskStep.TaskId
    43. Get
    44. Return MY_TASK_ID
    45. End Get
    46. End Property
    47. End Class
    48. ''' <summary>
    49. ''' Beispiel Task
    50. ''' Es werden 2 Properties gesetzt und das "Zielgerät" wird neugestartet.
    51. ''' Dieser Task hat die ID 1
    52. ''' </summary>
    53. ''' <remarks></remarks>
    54. Public Class MyTask1 : Implements GenericTaskstepInterface.ITaskStep
    55. Private Const MY_TASK_ID As UInt16 = 1
    56. Public Function Execute(obj As Object) As Boolean Implements GenericTaskstepInterface.ITaskStep.Execute
    57. Dim dataObject As DynamicDataType = DirectCast(obj, DynamicDataType)
    58. dataObject.TestPropertyBool = False
    59. dataObject.TestPropertyString = "NOT EMPTY"
    60. Return dataObject.RebootDevice()
    61. End Function
    62. Public ReadOnly Property TaskId As UShort Implements GenericTaskstepInterface.ITaskStep.TaskId
    63. Get
    64. Return MY_TASK_ID
    65. End Get
    66. End Property
    67. End Class
    68. 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.