【发布时间】:2014-11-13 14:18:40
【问题描述】:
我们有一个 Windows 窗体应用程序实例化一个 dll,并在该 dll 中实例化类。
编辑:
所以流程是这样的:
FORM > alpsClient (DLL) > 类
我想从班级更新 FORM 上的 backgroundWorker_ProgressChanged 事件。
结束编辑
在类对象中完成可能需要很长时间的工作。
我想将某种类型的进度从课堂传回给调用表单。
我想我需要使用事件。
但是我应该如何引用在后台工作人员中启动进程的表单。
下面是实例化 dll 对象的代码:
Private Sub alpsManual_bgw_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles alpsManual_bgw.DoWork
Try
Dim arg As String = CStr(e.Argument)
objDoc = New alpsClient
'* Set variables and start
' CUT ...
If fromArchive Then
'********************************************
'* Manual Settings *
'********************************************
' SET PROPERTIES
... CUT for brevity
'********************************************
End If
objDoc.docMap()
'* Wait until isComplete before starting next
Do
System.Threading.Thread.Sleep(1000)
Loop Until objDoc.isComplete
Catch ex As Exception
下面是实例化alpsClient.docMap中的类的代码:
Dim objControl As Object = Nothing
Select Case docRef
Case "YL0PF" 'Arrears Advice
objControl = New YL0PF
Case "YL2PF" 'Arrears with Additional Interest
objControl = New YL2PF
... etc
然后:
objControl.dbConn = masterDB
objControl.docRef = docRef
objControl.table2Format = table2Format
objControl.newAddressFormat = newAddressFormat
objControl.dteinp = runDate
' Start
docMap = ""
If Not objControl.Controller() Then docMap = "Errors"
在 objControl 引用的类中,我想将进度消息发送回调用表单...可能使用事件。
或者这是一个非常糟糕的主意?
【问题讨论】:
-
为什么这个标签是 C#?
-
听起来很合理。唯一需要注意的是,如果事件是由在后台线程上运行的代码引发的,则处理该事件的代码也将在后台线程上。如果这试图更新 GUI 将会崩溃:只能在 GUI 线程上更新 GUI。通过在后台线程中对 GUI 对象使用 .Invoke 方法或使用 SynchronizationContext 对象,这相对容易。
-
所以我需要注册一个事件,然后引发该事件或调用后台工作者'ProgressChanged'事件?