gpt4 book ai didi

c# - 无法弄清楚c#中的多线程问题

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

我初体验多线程有问题。我想了解它是如何工作的,所以我在自己编写的简单示例上进行了尝试。

因此,有类 PaySystem:

    internal abstract class PaySystem
{
public int payOperationTime;
public readonly object _payLock = new object();

public void Pay()
{
Console.WriteLine("There is a pay order in {0} pay system", GetType().Name);

if (Monitor.TryEnter(_payLock))
{
Console.WriteLine("{0} pay system is ready work, so we can start pay operation", GetType().Name);
}
else
{
Console.WriteLine("{0} pay system is locked now by other pay operation, so we need to wait for end of last", GetType().Name);
}

lock (_payLock)
{
Console.WriteLine("Start pay operation on {0} pay sytem", GetType().Name);
Console.WriteLine("payOperationTime for {0} paySystem will be {1}", GetType().Name, payOperationTime.ToString());
Thread.Sleep(payOperationTime);
}

Console.WriteLine("Pay done by {0} pay system", GetType().Name);

}
}

所以,在我的 Main() 方法中接下来会发生:

        PayPal payPal = new PayPal();

Thread payPalPayment = new Thread(payPal.Pay);
Thread payPalPayment2 = new Thread(payPal.Pay);

payPalPayment.Start();
payPalPayment2.Start();

Console.ReadKey(true);

作为输出,我有不可预知的(对我而言)结果。我将控制台输出的打印屏幕附加为文件。

enter image description here

但是,简而言之,看起来第二个线程在第一个线程结束后没有继续付款。

如果我没理解错的话,我可以启动线程,并在锁定器解锁时执行/到达被锁定器锁定的 block 。

有人可以解释我不明白的地方或我不明白的地方吗?

编辑 1

我的问题是:为什么第二个线程不继续付款?锁定代码块中的行。

编辑 2. 回答

我想检查 locker 对象是否被锁定,我使用了 TryEnter() 方法。亲爱的 stackoverflow 观众,我在你们的帮助下弄明白了,为了我的目的,我需要使用 IsEntered() 方法。

谢谢大家

最佳答案

您似乎对 Monitor.Enter 和 lock 感到困惑。

Monitor.TryEnter 尝试获取对象的锁。如果成功,该对象将保持锁定状态,直到您对其执行 Monitor.Exit。你永远不会这样做。

Lock 是 Monitor.Enter 后跟 Monitor.Exit(在 block 的末尾)的简写。锁是您真正需要的一切 - 如果您取出 Monitor.TryEnter,它将按您预期的那样工作。

关于c# - 无法弄清楚c#中的多线程问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39708419/

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