我有以下方法:
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/