使用BeginInvoke调试怪异

时间:2010-12-01 23:39:03

标签: c# .net debugging compact-framework

我有以下方法:

protected void OnBarcodeScan(BarcodeScannerEventArgs e)
{
    if (BarcodeScan != null)
    {
        //BarcodeScan.BeginInvoke(e, null, null);
        BarcodeScan(e);
    }
}

当我尝试进入上述方法时,它工作正常。我能够介入该方法的所有部分。

但是,如果我切换评论(因此BarcodeScan(e)被注释掉并删除BarcodeScan.BeginInvoke(e, null, null)上的评论,那么我就无法进入OnBarcodeScan方法的任何部分(即{{1}上的断点没有被击中。

我也试过在那里放一些调试语句。但只要那个开始调用调用就在那里,它就不会让我进入该方法。

我检查了输出,当我尝试介入它时说:

  

ScannerTest.exe中出现“System.NotSupportedException”类型的第一次机会异常   步入:踩过没有符号的方法'Symbol.Marshaller.SymbolMessageWindow.WndProc'   单步执行:单步执行没有符号的方法'Microsoft.WindowsCE.Forms.MessageWindow._WndProc'

当有一个BeginInvoke时,为什么整个方法都不能步进?

任何帮助都会很棒!

1 个答案:

答案 0 :(得分:4)

Compact Framework不支持异步委托调用(即BeginInvoke)。

至于调试器甚至不会破解方法的原因,我认为是因为以下原因:

  • BeginInvoke / EndInvoke方法由C#编译器生成(它是required to do this),标记为“native”。这意味着CLR将提供实施。
  • Compact Framework CLR does not provide the implementation
  • 当JIT编译器第一次执行方法时,它会查找它可能调用的所有方法(加载其他程序集等)。
  • 由于CLR不支持Delegate.BeginInvoke,因此任何调用它的方法都不能进行JIT编译,因此无法执行。
  • 首次调用NotSupportedException时抛出OnBarcodeScan(并且JIT编译器尝试编译它并失败)。这就是调试器无法进入的原因。
相关问题