1

使用 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 类中。在所有项目中搜索/替换。我觉得这样做很脏,但它至少解决了症状。当日程安排变得不那么紧张时,我会再次研究这个问题(是的,正确的)。

4

1 回答 1

0

当我的代码在一台计算机上正常工作而在另一台计算机上不正确时,我预计问题是我的应用程序正在使用的 DLL。所以我的建议是这样的:

  • 在您的机器和它工作的 VM 上运行该应用程序。
  • 在两台机器上运行 ProcessExplorer。
  • 在 ProcessExplorer 的下部窗格中显示 DLL。
  • 比较 DLL 版本以查看哪些版本不同(如果有)。
于 2012-12-18T15:40:19.727 回答