我有一個應用程式正在執行大量時間檢查并回圈遍歷資料表等,以在某些時間檢查某些值等。
最終結果是我有一個串列(字串),其中包含需要在特定時間運行的“時間表”的名稱。這些名稱對應于一組后臺作業人員的名稱。
我想知道是否有任何方法可以遍歷該串列,并使用作為字串變數的后臺作業人員名稱呼叫相應的后臺作業人員 RunWorkerAsync 方法?
后臺作業者已經在運行前宣告,它們的名字是靜態的——與串列中的名字相匹配。
我一直在查看 CallByName 函式,但找不到任何顯示它以這種方式使用的檔案的使用示例,所以我不確定我是否在那里陷入死胡同。
For Each schedule In run_these_schedules
CallByName(schedule, BackgroundWorker.RunWorkerAsync)
Next
任何幫助在高級贊賞!
uj5u.com熱心網友回復:
在設計器中,它們將默認宣告為
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
uj5u.com熱心網友回復:
擴展 djv 的優秀答案,您可以搜索Load()事件中所有后臺作業人員的表單,并將它們存盤在 a 中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
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/388607.html
上一篇:使用正則運算式替換特定位置的字符
