使用 C#、.NET 4.0 更新 4.0.3、Windows 7 64 位:
由于超出我职责范围的原因,我必须在后台处理消息时让 GUI 线程“休眠”。到目前为止,这完美无缺:
private void SleepWithEventLoop(int ms)
{
var timeout = DateTime.UtcNow.AddMilliseconds(ms);
while (DateTime.UtcNow < timeout && !disposed)
{
System.Windows.Forms.Application.DoEvents();
Thread.Sleep(1);
}
}
自从我今天早上启动 PC 以来,没有明显的原因,我开始收到这样的异常(来自日志文件的片段):
2012-12-18 12:50:41.204 | - None - | Exception | Exception caught: Der hinzuzufügende Wert war außerhalb des Bereichs.
| | | Parametername: value
| | | Details:
| | | bei System.DateTime.Add(Double value, Int32 scale)
| | | bei System.DateTime.AddMilliseconds(Double value)
| | | bei com.<...>.CanOpenProxyServer.SleepWithEventLoop(Int32 ms) in C:\Users\<...>\CanOpenProxy.cs:Zeile 78.
| | | bei com.<...>.CanOpenProxyServer.HandleConnection(MessageChannel channel) in C:\Users\<...>\CanOpenProxy.cs:Zeile 55.
我在使用 DateTime.Now 时遇到了一些问题,涉及切换到 DateTime.UtcNow 后消失的 DST,但上述异常仍然存在。IT 部门最近没有安装任何更新,我当然没有安装或删除任何程序或弄乱注册表。DateTime 怎么会突然“中断”?!?
我将上面的代码复制到一个新项目中单独测试它
while (true) SleepWithEventLoop(5);
它仍然崩溃了。重新安装 .NET 也不起作用。有任何想法吗?
编辑:在两位同事的 PC 上存在同样的问题,但在新安装的 VmWare 系统上却没有。开始看起来我们公司的 PC 配置有点滑稽。DateTime 是否需要任何“特殊”配置?
编辑 2:所以我通过 P-Invoking 到一个小的 C DLL 中“修复”了这个问题,该 DLL 暴露了 time.h 函数,包装在一个 DateTime 类中。在所有项目中搜索/替换。我觉得这样做很脏,但它至少解决了症状。当日程安排变得不那么紧张时,我会再次研究这个问题(是的,正确的)。