我有一个应用程序从数据库获取数据,处理它,然后将其发送到定义的IP。我想让它使用BackgroundWorker
来避免停止GUI。
BackgroundWorker
事件处理程序中的代码太长而且复杂,因此我想将该代码拆分为多个函数以更好地组织代码。
这样好吗?我可以在同一个Form1
类中编写这些函数,并从BackgroundWorker
调用它们吗?我需要创建一个新类吗?
答案 0 :(得分:4)
是的,如果不是可取的话,这是完全可以接受的。问题不在于您是否在调用BackgroundWorker
事件中的其他方法。相反,问题是这些功能实际做什么。如果他们正在修改UI控件,这是不可接受的,无论是完成还是事件处理程序还是在单独的函数中。类似地,如果他们使用与没有SyncLock
的UI线程共享的线程不安全的对象,那么在任何一个地方这也是一个问题。所以,是的,只要正在执行的工作是线程安全的,那么如果在事件处理程序,单独的方法或甚至在另一个类或库中完成它就根本不重要。
例如,如果您的方法需要从后台线程更新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
答案 1 :(得分:1)
BackgroundWorker当然可以调用函数。就像BackgroundWorker的DoWork方法中的代码一样,您需要确保函数中的代码不会尝试更新主线程中的代码正在更新的相同对象。例如,您需要避免更新UI控件,或使用线程安全的方式来执行此操作。