Public Class Form1 Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click Dim k As New jobs k.AddJob("writedata", AddressOf writedata) k.AddJob("p", AddressOf p) k.ApplyJobs() End Sub Private Function p() As Boolean MessageBox.Show("p") Return True End Function Private Function writedata() As Boolean MessageBox.Show("h") Return True End Function End Class Public Class jobs Public Property Jobs As New List(Of job) Public Sub ApplyJobs() For Each l In Jobs If Not l.Invoked Then l.func().Invoke() l.Invoked = True End If Next End Sub Public Sub ApplyJob(name As String) For Each l In From l1 In From l1 In Jobs Where l1.name = name Where Not l1.Invoked l.func().Invoke() l.Invoked = True Next End Sub Public Sub ApplyJobs(ParamArray jobnames() As String) For Each l In jobnames ApplyJob(l) Next End Sub Public Sub AddJob(name As String, job As Func(Of Boolean)) Jobs.Add(New job() With {.name = name, .func = job, .Invoked = False}) End Sub Public Sub AddJob(name As String) AddJob(name, AddressOf DefaultJobHandler) End Sub Public Sub RemovedJob(name As String) For Each job In Jobs If job.name = name Then Jobs.Remove(job) End If Next End Sub Public Sub RemoveJobs() Jobs.Clear() End Sub Public Sub CopyJob(job1 As String, job2 As String) For Each job In Jobs If job.name = job1 Then AddJob(job2, job.func) End If Next End Sub Public Sub CopyJob(job As String) For Each j In Jobs If j.name = job Then AddJob(job & "copied", j.func) End If Next End Sub Private Function DefaultJobHandler() As Boolean Return True End Function End Class Public Class job Public Property name As String Public Property [func] As Func(Of Boolean) Public Property Invoked As Boolean End Class