从 BackGroundWorker 调用函数是否正确?

Is correct to call a function from a BackGroundWorker?

我有一个应用程序可以从数据库中获取数据,对其进行处理,然后将其发送到定义的 IP。我想让它使用 BackgroundWorker 来避免停止 GUI。

BackgroundWorker事件处理程序中的代码太长太复杂,所以我正在考虑将该代码拆分为多个函数以更好地组织代码。

这样可以吗?我可以在同一个 Form1 class 中编写这些函数并从 BackgroundWorker 中调用它们吗?我需要创建一个新的 class 吗?

BackgroundWorker当然可以调用函数。正如 BackgroundWorker 的 DoWork 方法中的代码一样,您需要确保函数中的代码不会尝试更新主线程中的代码正在更新的相同对象。例如,您需要避免更新 UI 控件,或者使用线程安全的方式来执行此操作。

是的,即使不是更可取,也完全可以接受。问题不在于您是否从 BackgroundWorker 事件调用其他方法。相反,问题是这些函数实际上 做什么 。如果他们正在修改 UI 控件,那是不可接受的,无论是在事件处理程序中还是在单独的函数中完成。同样,如果他们使用与 UI 线程共享而没有 SyncLock 的线程不安全对象,那么这在任何一个地方都是一个问题。所以,是的,只要正在执行的工作是线程安全的,那么无论它是在事件处理程序、单独的方法,还是在另一个 class 或库中完成都没有关系。

例如,如果您的方法需要从后台线程更新 RichTextBox 控件,您可以这样做:

Private Sub BackgroundWorker1_DoWork(sender As Object, e As DoWorkEventArgs) Handles BackgroundWorker1.DoWork
    GenerateReport()
End Sub

Private Sub GenerateReport()
    Dim rtf As String = ' ...
    Me.Invoke(Sub() RichTextBox1.Rtf = rtf)
End Sub