Vb.net BackgroundWorker完成后阻止的所有COM事件(在AppDomain内)
我有一个程序可以处理一个类的多个实例,每个类都有自己的DLL COM对象实例。为了确保每个类都使用一个单独的实例,我使用AppDomain创建了该类:Vb.net BackgroundWorker完成后阻止的所有COM事件(在AppDomain内),vb.net,dll,event-handling,backgroundworker,appdomain,Vb.net,Dll,Event Handling,Backgroundworker,Appdomain,我有一个程序可以处理一个类的多个实例,每个类都有自己的DLL COM对象实例。为了确保每个类都使用一个单独的实例,我使用AppDomain创建了该类: _objectDomain = AppDomain.CreateDomain("somename") Dim item As ObjectType item = CType(_objectDomain.CreateInstanceAndUnwrap(GetType(ObjectType).Assembly.FullName, _ GetType(
_objectDomain = AppDomain.CreateDomain("somename")
Dim item As ObjectType
item = CType(_objectDomain.CreateInstanceAndUnwrap(GetType(ObjectType).Assembly.FullName, _
GetType(ObjectType).FullName), ObjectType)
'do a bunch of stuff to item
_itemList.Add(item)
稍后,我将初始化COM对象中使用的连接:
For Each obj In _itemList
obj.Connect()
Next
每个连接都会:
Private Sub Connect()
Try
_item.Connect("SQL", TableName)
If Not _item.Initialized Then _
Throw New Exception("Connection was not initialized.")
_item.StartMirroring() 'this watches specified files to see if they've been updated
Catch Ex As Exception
Alert("Could not connect to database.")
End Try
End Sub
当AppDomains并行运行时,每个obj.connect()调用都会等待_item.connect()完成,然后再继续,因此如果我有多个项,初始化可能需要一些时间。因此,我尝试使用BackgroundWorker使它们同时运行:
Public Sub Connect()
_itemWorker = New BackgroundWorker
AddHandler _temWorker.DoWork, AddressOf ConnectWorker
AddHandler _itemWorker.RunWorkerCompleted, AddressOf StartMirror
_itemWorker.RunWorkerAsync()
End Sub
但是,如果我这样做,\ u项中的事件在激发RunWorkerCompleted后不再激发。.Connect()函数会引发许多事件,所有这些事件在BackgroundWorker内部和外部都会成功触发,但一旦我进入StartMirror,事件就不再从COM中引发(调用.StartMirror()时,我应该会得到一个MirrorStateChanged事件,但什么都不会发生)。如果我把后台工作人员带出去,让他们按顺序走,他们就不会有问题了。在任何一种情况下,我都可以在我的课堂上提出问题
根据:
BackgroundWorker事件不会跨AppDomain边界封送。请勿使用BackgroundWorker组件在多个AppDomain中执行多线程操作
然而,我不认为这是一个问题,原因有二: