Double.NaN 在 Windows 11 中导致 System.StackOverflowException (22621.525)

2024-03-24

Note:该代码适用于 Windows 11 (22000.1098) 及更早版本,但会在 Windows 11 (22621.525) 上导致堆栈溢出异常

我有一个错误,导致我负责的 C# 程序出现大量问题。它在早期的 Windows 版本(包括早期的 Windows 11)中运行良好。它也适用于调试版本。但它在发布版本中引发异常。我已经深入到出现问题的各个功能,这很奇怪。

代码是这样的

MySettings.MySetting setting = new MySettings.MySetting()
{
    Value = Double.NaN,
    Values = new double[] { Double.NaN },
    Special = "" }
});

但如果我将 Double.NaN 更改为数值,则代码可以工作。

我试图将其简化为

MySettings.MySetting setting = new MySettings.MySetting();
set1.Value = Double.NaN;
set1.Values = new double[] { Double.NaN };
set1.Special = "";

删除 Special 不会改变任何内容,但如果 Value 或 Values 为 NaN,则会引发异常。

最小形式的设置类是

public class MySetting
{
    public Double Value { get; set; }
    public string Special { get; set; }
    public Double[] Values { get; set; }
    public ValueSpecial[] Specials { get; set; }

    public ValueSpecial AddSpecial(string code, string value)
    {
        ValueSpecial special = new ValueSpecial() { Code = code, Value = value };
        return special;
    }

    public void ForgetSpecial(string code)
    {
    }
    
    public override string ToString()
    {
        return "Not today";
    }
}

ValueSpecial 非常简单

public class ValueSpecial
{
    public string Code { get; set; }
    public string Value { get; set; }

    public override string ToString()
    {
        return "dummy";
    }
}

调用堆栈看起来很无辜。 Main() -> MainForm() -> InitializeComponent() -> MyControl() 所以它似乎没有发生任何递归。

Microsoft 在此版本的 Windows 中更改了哪些内容?我该如何解决?

请注意,相同的二进制文件适用于 Windows 11 22000.1098,因此不要只关注代码。

看起来像https://stackoverflow.com/a/25208200/1771388 https://stackoverflow.com/a/25208200/1771388或许可以给出答案。


本身不是修复,而是一种解决方法。问题发生在 FPU 中,可能是由较旧的程序或库引起的。它出现在 Windows 11 (22621.525) 中,但在早期版本中没有出现,可能与 Windows 工作方式的变化有关。

无论如何,您可以通过添加强制重置 PFU 来解决该问题

try
{
    throw new Exception("Please ignore, resetting FPU");
}
catch {}

在调用导致异常的函数之前。如果您需要从多个地方执行此操作,将其包装到函数中可能是个好主意。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Double.NaN 在 Windows 11 中导致 System.StackOverflowException (22621.525) 的相关文章

随机推荐