vb.net - 从 bw 的名称作为变量调用 backgroundworkers runworkerasync 方法

Posted

技术标签:

【中文标题】vb.net - 从 bw 的名称作为变量调用 backgroundworkers runworkerasync 方法【英文标题】:vb.net - call a backgroundworkers runworkerasync method from bw's name as a variable 【发布时间】:2022-01-17 07:59:24 【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

可能,但您需要显示一些代码。后台工作人员是否在您的代码中声明为变量,其名称是您列表中的字符串?如果是这样,它们是类级别的属性还是本地 Dims?需要在代码中看到 是的,但是实际的后台工作人员是如何定义的? 感谢 djv - 我已经更新了我的问题并将继续这样做。后台工作人员已经声明并且是类级别的。 :) 每个run_these_schedules中的schedule是backgroundworkers的名称,还是它们对应方法的名称? @djv - 它们作为对象添加到设计中。这个应用程序是一个 .net windows 服务,因此它们是设计中的唯一对象。 【参考方案1】:

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

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

看起来像一个字段,但是once WithEvents gets added this is a property

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

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

【讨论】:

【参考方案2】:

扩展 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

【讨论】:

很好,前端加载反射以加快执行速度

以上是关于vb.net - 从 bw 的名称作为变量调用 backgroundworkers runworkerasync 方法的主要内容,如果未能解决你的问题,请参考以下文章

vb.net怎么添加类

如何在 VB NET 中将方法名称作为过程的参数传递

VB.NET:从 LCID 获取本地语言名称

如何用vb.net 调用VBS文件?

VB.net调用DLL,捕捉到AccessVioationException尝试读取或写入受保护的内存。这通常指示其他内存已损坏。

vb.net怎么从DataSet中读取一行的数据