我有一个对象启动一个线程,打开一个文件,并等待来自其他类的输入。当它接收输入时,会将其写入磁盘。基本上,它是一个线程安全的数据记录类......
这是奇怪的部分。当我在使用该对象的设计器 (Visual Studio 2008) 中打开表单时,就会创建文件。它显然是在设计时虚拟主机进程下运行的......
奇怪的是我无法在另一个项目中重现这个问题。我不确定在设计器中执行的代码和不在设计器中执行的代码的规则是什么。例如,在 Windows 窗体构造函数中创建文件实际上并不在设计时创建该文件......
解释是什么?有参考吗?
在设计器中编辑该类时,不会执行控件或表单的构造函数(也不会调用 OnLoad)。我偶尔会使用它在设计器中设置一个值(例如,使其子控件在设计器中全部可见),但在构造函数中将其中一些重写为不同的默认值(例如,隐藏某些仅显示的子控件)在某些情况下,例如状态栏上的指示器)。
然而,构造函数does如果该控件作为子控件放置在设计器中的另一个控件或窗体上,则会执行。 OnLoad 也会被执行。这可能是您的日志记录代码在设计器中意外触发的原因。
为了检测设计与运行时,一个答案 to 另一个问题有一些经验测试的屏幕截图,显示了一些常见方法返回的值。看起来,设计器中正在编辑的窗体或控件的子控件(向下两级)的子控件看到它自己的 DesignMode == false,因此正常的属性检查将无法保护代码(例如,在 OnLoad 方法中) ) 对于嵌套在设计器中添加的控件内的控件。如果您按照预期检查 DesignMode,则可能是嵌套导致它绕过了该检查。它还总是在构造函数中看到 DesignMode == false。
另请注意 LicenseManager.UsageMode 检查only在构造函数中看到 DesignTime;当 OnLoad 被调用时,它位于 RunTime LicenseContext 内。最完整的解决方案似乎是在控件或表单(或组件)的构造函数中检查 LicenseManager.UsageMode 并将设置保存到成员变量或属性中,您可以稍后检查以避免运行不应在设计器中运行的代码即使嵌套时。还有另一种方法另一个答案对于另一个问题,它解释了嵌套但仅在构造函数之外起作用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)