有没有一些方法可以让主窗体监听ClassB的自定义事件的任何提升,而无需参考引发该事件的ClassB的特定实例?类级别而非实例处理自定义事件?
将生成事件的ClassB的实例目前在表单知道的ClassA实例内匿名实例化。
(最后更新:我直接调用MainForm的方法,如我所料是公认的答案to this question没有工作的原因)
更新我怀疑它比我想象的更复杂。下面的引用解释了为什么我对MainForm.DataReady()的调用不起作用 - 以一种令人难以捉摸的方式。
.NET事件的魔法隐藏,当你通过一个实例订阅到B的情况下一个事件,一个被发送过来到B的AppDomain中的事实。如果A不是MarshalByRef,则发送A的值拷贝。现在你已经有了两个单独的A实例,这就是你遇到意外行为的原因。
Cross AppDomain MarshallByRef vs value copy discussion
UPDATE2:
使用:
Debug.WriteLine("SetWaitState executing with Id={0}", AppDomain.CurrentDomain.Id)
而在MainForm
本地事件处理程序的上下文中执行MainForm.DataReady()
,虽然从ClassB
称为表明,他们正在运行在相同的AppDomain
每次。这留下了不同的线索作为问题的原因 - 但在每种情况下MainForm.InvokeRequired
都返回false。它仍然没有任何意义 - 但至少是定制事件 - 必要时冒出来 - 确实奏效。
下面的代码说明了这些关系。
Class MainForm
private A as New ClassA
private sub getData
A.getData() 'Sets up the com object & callback
end sub
Private Sub _ClassB_HandleEvent(ResultMessage As String) Handles {some static/shared reference to ClassB}.CustomEvent
'do something with the Message
End Sub
End Class
Class ClassA
public sub getData()
Dim ComObj as New ComObject
Call ComObj.setClient(New ClassB)
End Sub
End Class
Class ClassB
Implements IComObjectClient
Public Event CustomEvent(ByVal ResultMessage As String)
sub getdata_callback(results() as Object) handles IComObjectClient.getdata_callback
' Get the results
RaiseEvent CustomEvent("Got Data") 'because calling MainForm.DataReady() doesn't work
end sub
End Class
这是不可能的。事件由对象而不是类来提升。您可以为所有对象提供相同的事件处理程序,请使用AddHandler + AddressOf关键字。但是这通常会导致流泪,因为COM事件不会打扰任何类似* sender *参数的传递。 –