gpt4 book ai didi

c# - 私有(private)成员变量在类背后的asp.net代码中真的是线程安全的吗?

转载 作者:太空狗 更新时间:2023-10-30 00:27:06 24 4
gpt4 key购买 nike

我看到一个随机异常“集合已修改;枚举可能无法执行”- InvalidOperationException。

异常指向下面代码片段中的 foreach 行,我知道在枚举时修改集合时会发生这种情况。

但是在我的场景中,我没有看到它真正发生的机会——除非私有(private)成员不是线程安全的。我可能是错的,但我需要帮助来理解和弄清楚这一点 .

这是我的代码的样子

我有类背后的代码,它有一个私有(private)集合,比如

private Dictionary<string, string> _someDictionary = SomeConstantClass.ConstantValue;

在页面预渲染完成事件中,我正在枚举字典

protected override void OnPagePreRenderComplete(object sender, EventArgs e){
_someDictionary["AnotherKey"] = "Another value";

foreach(var dataValuePair in _SomeDictionary){
//Do some operation
}
}

我还有一个可以修改这个集合的公共(public)属性,但它在 ascx 文件中设置为

<tc: UserControlA runat="server" id="abc" CustomProperty="true" />

这是它的实现,

public bool CustomProperty{
set{
if (value)
_someDictionary["CustomProperty"] = "Custom Value";
}
}

它肯定修改了我的成员变量集合——但根据我的理解,这个属性应该在 Control Init 本身中触发和完成。

因此,我仍然没有看到在预渲染完成事件期间修改集合的场景。

知道什么会导致异常发生吗?

其他注意事项:虽然这个特定的用户控件没有做任何花哨的事情,甚至没有回发方案,但该页面当然有许多更新面板。从日志中我看到问题发生在对页面的 HTTP GET 请求中。

此外:建议我重现此方法(如果有的话)。

有兴趣了解SomeConstantClass.ConstantValue的小伙伴们,这里是

class SomeConstantClass{
public static Dictionary<string, string> ConstantValue = new Dictionary<string, string> {
{"ABCD", "EFGH"},
{"HIJK", "LMNO"}
};
}

最佳答案

如果您从 SomeConstantClass.ConstantValue 返回同一个实例,那么多个页面的私有(private)成员变量将指向同一个对象。这将导致对象在一个页面的初始化时被更改,而它在另一页的 OnPagePreRenderComplete 上被迭代。

确保在每次访问 SomeConstantClass.ConstantValue 时返回字典的新实例。示例:

public static Dictionary<string, string> ConstantValue
{
get
{
return new Dictionary<string, string>
{
{"ABCD", "EFGH"},
{"HIJK", "LMNO"}
};
}
}

这样每个页面都会有自己的字典对象来使用。这是快速解决方案,您可以重构逻辑,这样您就不必为每个页面创建一个新字典。

基本上,私有(private)成员变量只有在引用该页面私有(private)的对象并且没有其他人知道该对象或对象本身被设计为线程安全的情况下才是线程安全的。通过私有(private)成员封装对非线程安全静态对象的访问不会使其成为线程安全的。

关于c# - 私有(private)成员变量在类背后的asp.net代码中真的是线程安全的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8067538/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com