我有以下方法:

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


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

但是,如果我切换注释(因此BarcodeScan(e)被注释掉并删除BarcodeScan.BeginInvoke(e, null, null)上的注释,那么我将无法进入OnBarcodeScan方法的任何部分(即,if (BarcodeScan != null)上的断点不会被击中)。

我也尝试在其中放置一些调试语句。但是,只要在那里有begin invoke调用,它就不会允许我进入该方法。

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


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


当其中包含BeginInvoke时,为什么整个方法都无法步进?

任何帮助将是巨大的!

最佳答案

紧凑框架不支持异步委托调用(即BeginInvoke)。

至于调试器什至不进入该方法的原因,我相信是由于以下原因:


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

关于c# - 使用BeginInvoke调试怪异,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4330272/

10-12 06:44