gpt4 book ai didi

C# 为什么我的 lock 语句挂起?

转载 作者:太空狗 更新时间:2023-10-29 23:55:09 26 4
gpt4 key购买 nike

我遵循了一些关于如何创建自定义事件访问器的教程。这是我的代码:

event ControlNameChangeHandler IProcessBlock.OnControlNameChanged
{
add
{
lock (ControlNameChanged)
{
ControlNameChanged += value;
}
}
remove
{
lock (ControlNameChanged)
{
ControlNameChanged -= value;
}
}
}

在代码到达 add statament 中的 lock(ControlNameChanged) 时,没有任何反应。代码不再运行。但是我的应用程序仍在运行。它不会卡住或其他东西。

出了什么问题?

最佳答案

不知何故,别人持有一把锁。您不应使用多播委托(delegate)实例或事件进行锁定,也不应使用公共(public)成员,因为您无法控制谁在锁定以及何时锁定。

因此我会像这样使用一个单独的锁定对象:

private readonly object controlNameChangedSync = new object();

event ControlNameChangeHandler IProcessBlock.OnControlNameChanged
{
add
{
lock (controlNameChangedSync)
{
ControlNameChanged += value;
}
}
remove
{
lock (controlNameChangedSync)
{
ControlNameChanged -= value;
}
}
}

注意:在委托(delegate)上执行 +=-= 时,对事件的引用会发生变化。

关于C# 为什么我的 lock 语句挂起?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2026879/

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