我的应用程序中有以下代码
If _oCurrentCall.CustomData.Length > 0 AndAlso UsageType = UsageTypeEnum.Vanlig Then
RaiseEvent NewIncomingCallWithCustomData(_oCurrentCall)
ElseIf UsageType = UsageTypeEnum.Sentralbord Then
RaiseEvent NewIncomingCall(_oCurrentCall, Queues)
End If在没有调试的情况下,事件会被很好地引发并正常工作。但是,当调试和尝试更改执行步骤时,例如将执行步骤拖到另一个条件块中的raiseevent,该事件不会触发。
我做错了什么?
发布于 2012-06-20 19:58:28
我是复制品。可以说,这是调试器中的一个bug,在我看来很难修复。在将代码从vb.net反编译成C#时,会更容易看到。下面是示例代码:
Class Test
Public Event Foo As EventHandler
Public Event Bar As EventHandler
Public Sub Run(ByVal arg As Integer)
If arg = 0 Then
RaiseEvent Foo(Me, EventArgs.Empty)
Else
RaiseEvent Bar(Me, EventArgs.Empty)
End If
End Sub
End Class转换为以下等效的C#代码:
public void Run(int arg)
{
EventHandler VB$t_ref$S0;
if (arg == 0)
{
VB$t_ref$S0 = this.FooEvent;
if (VB$t_ref$S0 != null)
{
VB$t_ref$S0(this, EventArgs.Empty);
}
}
else
{
VB$t_ref$S0 = this.BarEvent;
if (VB$t_ref$S0 != null) // <=== HERE!!!
{
VB$t_ref$S0(this, EventArgs.Empty);
}
}
}当您使用Set Next statement调试器命令将执行点设置为第二个RaiseEvent语句时,调试器会将执行点移动到上面代码段中由HERE标记的语句。绕过临时变量的初始化。它仍然为空,因此不会引发该事件。在使用该命令之后,您可以通过使用Debug + Windows + Disassembly查看机器代码来观察到这种情况。
除此之外,这是任何C#程序员都非常熟悉的事件引发代码,他们没有raise事件访问器,所以必须编写以下代码:
var temp = Bar;
if (temp != null) {
Bar(this, EventArgs.Empty);
}嗯,调试器弄错了这一点,很容易看出它是如何发生的。以及它怎么会在没有被发现(或被忽视)的情况下持续这么长时间。解决办法很难找到,在RaiseEvent语句之前的语句可以工作,但非常不切实际。修改变量以使If语句执行所需事件是可能的。
我在connect.microsoft.com的反馈文章is here上报告了这个问题。不要期待奇迹。
https://stackoverflow.com/questions/11118293
复制相似问题