gpt4 book ai didi

C# Lock ("string") 不适用于动态参数?

转载 作者:太空宇宙 更新时间:2023-11-03 19:10:03 25 4
gpt4 key购买 nike

我正在使用 C# 锁来阻止代码执行。如果我们在 Lock 中使用动态字符串输入,它是行不通的。

public class ParameterClass
{
public string A = string.Empty;
public Int64 B = 0;
}

class Program
{
static void Main(string[] args)
{
ParameterClass parm = new ParameterClass { A = "Test", B = 1 };
Thread thread = new Thread(ThreadFun);
thread.Start(parm);

System.Threading.Thread.Sleep(2000);

parm = new ParameterClass { A = "Test", B = 1 };
ThreadFun(parm);
}

public static void ThreadFun(object para)
{
ParameterClass parameter = (ParameterClass)para;
lock (parameter.B.ToString())
{
Console.WriteLine(DateTime.Now);
System.Threading.Thread.Sleep(20000);
}
}
}

在这里,我在 Lock 语句中放置了 Thread.Sleep(20000) - 20 秒。我的预期结果是应该根据参数锁定代码块。B ...

有人可以帮助我继续吗?

最佳答案

您的代码锁定等同于以下内容,因为 ToString() 通常会在每次调用时创建新字符串:

 lock(new object()) { ... }

由于每次锁定不同的对象,这显然不会阻止其他线程执行同一代码块。

您想锁定与 protected block 中访问的数据有某种关联的对象。在您的情况下,它可能是 para 本身或 parameter 中的其他引用类型值(值类型 B 不能使用)如果确实如此执行期间不改变:

 lock(para)
{....}

请注意推荐的方法,如果有特殊的“锁定”私有(private)对象,用于保护通过同一类的方法访问数据...

通过 lock 保护对 2 个属性的访问的类示例:

public class ParameterClass
{
private object lockObject = new object();
private string a = string.Empty;
private Int64 b = 0;

public SafeSet(string v, long number)
{
lock(lockObject)
{
a = v;
b = number;
}
}

public string A
{
get { lock(lockObject) { return a; } }
}

public long B
{
get { lock(lockObject) { return b; } }
}
}

关于C# Lock ("string") 不适用于动态参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21473467/

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