Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net BackgroundWorker完成后阻止的所有COM事件(在AppDomain内)_Vb.net_Dll_Event Handling_Backgroundworker_Appdomain - Fatal编程技术网

Vb.net BackgroundWorker完成后阻止的所有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(

我有一个程序可以处理一个类的多个实例,每个类都有自己的DLL COM对象实例。为了确保每个类都使用一个单独的实例,我使用AppDomain创建了该类:

_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中执行多线程操作

然而,我不认为这是一个问题,原因有二:

  • BackgroundWorker包含在该类实例的AppDomain中,并且不与主线程以外的任何其他AppDomain通信(通过事件)
  • 事件仍然会在BackgroundWorker中触发,但不会在事件完成后触发
  • 我曾尝试在Worker结束后重新关联处理程序,并在主应用程序级别创建BackgroundWorker,但都没有成功。为什么COM对象会停止引发事件?我仍然可以很好地与它交互,但不幸的是(第三方,封闭源代码)COM主要通过事件进行通信,所以我不能只是ping它来询问它是否正在积极检查镜像。如果我必须按顺序执行大型流程,这没关系,因为它的用途非常有限,但如果可能的话,我更愿意在后台运行这些流程