1

我有一个应用程序进行大量时间检查并循环遍历数据表等,检查特定时间的特定值等。

最终结果是我有一个列表(字符串),其中包含需要在特定时间运行的“时间表”的名称。这些名称对应于一组后台工作人员的名称。

我想知道是否有任何方法可以遍历该列表,并使用作为字符串变量的后台工作人员名称调用相应的后台工作人员 RunWorkerAsync 方法?

后台工作人员已在运行前声明,并且它们的名称是静态的 - 与列表中的名称匹配。

我一直在查看 CallByName 函数,但找不到任何显示它以这种方式使用的文档的使用示例,所以我不确定我是否正在走向死胡同。

 For Each schedule In run_these_schedules
 CallByName(schedule, BackgroundWorker.RunWorkerAsync)
 Next 

任何帮助在高级表示赞赏!

4

2 回答 2

4

在设计器中,它们将默认声明为

Friend WithEvents BackgroundWorker1 As ComponentModel.BackgroundWorker
Friend WithEvents BackgroundWorker2 As ComponentModel.BackgroundWorker
' ...

看起来像一个字段,但是一旦添加了 WithEvents,这就是一个属性

所以我们可以使用反射并通过名称获取属性

Dim run_these_schedules As New List(Of String) From {"BackgroundWorker1", "BackgroundWorker2"}
For Each schedule In run_these_schedules
    Dim t = GetType(Service1)
    Dim pi = t.GetProperty(schedule,
                           Reflection.BindingFlags.Instance Or
                           Reflection.BindingFlags.Public Or
                           Reflection.BindingFlags.NonPublic)
    Dim bw = DirectCast(pi.GetValue(Me), BackgroundWorker)
    bw.RunWorkerAsync()
Next
于 2021-12-13T22:40:01.640 回答
3

扩展 djv 的优秀答案,您可以在表单中搜索Load()事件中的所有后台工作人员并将它们存储在一个Dictionary(Of String, BackgroundWorker)快速查找中:

Private BWs As New Dictionary(Of String, BackgroundWorker)

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    For Each pi As Reflection.PropertyInfo In Me.GetType.GetProperties(Reflection.BindingFlags.Instance Or Reflection.BindingFlags.NonPublic)
        Dim obj As Object = pi.GetValue(Me)
        If TypeOf (obj) Is BackgroundWorker Then
            Dim bw As BackgroundWorker = DirectCast(obj, BackgroundWorker)
            BWs.Add(pi.Name, bw)
        End If
    Next
End Sub

Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    Dim run_these_schedules() As String = {"BackgroundWorker1", "BackgroundWorker2", "UnicornsExist"}
    For Each schedule In run_these_schedules
        If BWs.ContainsKey(schedule) Then
            BWs(schedule).RunWorkerAsync()
        Else
            Debug.Print("Schedule not found: " & schedule)
        End If
    Next
End Sub
于 2021-12-14T20:21:13.400 回答