未处理的异常:状态管理器设置值的大小已超出限制

本文关键字:异常 状态 管理器 设置 未处理 | 更新日期: 2023-09-27 18:28:20

我们的一些客户看到了这种未经处理的异常,我们自己从未经历过,也无法重现。

未处理的异常:状态管理器设置值的大小已超过限制(Excep_FromHResult 0x80073DC8)

是什么原因导致了此异常?

未处理的异常:状态管理器设置值的大小已超出限制

LocalSettings确实有一些限制,请参阅ApplicationData.LocalSettings|LocalSettings属性中的备注部分:

每个设置的名称最多可以是255个字符。每个设置的大小最多可达8K字节,每个组合设置的大小最大可达64K字节。

当设置的大小过大时,会引发此异常。尽管对设置的总数没有一般的大小限制,但最好将大型数据集存储到独立存储中的文件中。因此,正如@pstrjds所说,你可能需要验证应用程序中设置的大小,如果其中一些设置可能很大,你可以尝试将它们存储在LocalFolder中。

对通用Windows应用程序进行了一些测试,发现每个属性值的大小不得超过4095字节。因此,以下代码将修复它:

/// <summary>
/// Application settings
/// Limit to 200*4095
/// </summary>
private const string SET_STR = "SETTINGS";
private const int CHUNK_SIZE = 4095;
static private ApplicationDataContainer localSettings = ApplicationData.Current.LocalSettings;
static private string AppSettings {
    get {
        string set = "";
        for (int i = 0;i < 200;i++) {
            string s = (string)localSettings.Values[SET_STR + i];
            if (s != null) {
                set += s;
            } else {
                break;
            }
        }
        return set;
    }
    set {
        for (int i = 0;i < 200;i++) {
            localSettings.Values[SET_STR + i] = null;
        }
        for (int i = 0;i * CHUNK_SIZE < value.Length;i++) {
            if (value.Length > i * CHUNK_SIZE) {
                int len = (i + 1) * CHUNK_SIZE > value.Length ? value.Length % CHUNK_SIZE : CHUNK_SIZE;
                localSettings.Values[SET_STR + i] = value.Substring(i * CHUNK_SIZE, len);
            }
        }
    }
}