gpt4 book ai didi

c# - 遇到锁时如何停止线程?

转载 作者:行者123 更新时间:2023-12-03 13:20:44 24 4
gpt4 key购买 nike

我有以下代码启动了一些线程:

    List<Stuff> lNewStuff = new List<Stuff>();

// populate lNewStuff

for (int i = 0; i < accounts.Length; i++)
{
Account aTemp = _lAccounts.Find(item => item.ID == accounts[i]);

Thread tTemp = new Thread(() => aTemp.ExecuteMe(lNewStuff));
tTemp.Start();
}

然后在Account类中,您具有具有锁定的ExecuteMe方法:
    public class Account
{
private Object lockThis = new Object();

public void ExecuteMe(List<Stuff> lNewStuff)
{
//Ensure only one thread at a time can run this code
lock (lockThis)
{
//main code processing
}
}
}

现在,线程有时以lNewStuff == null开头,因为有时找不到带有帐户ID的任何新内容。这对于该项目是正常的。该线程应始终尝试运行,但是当为null时,我希望该线程死亡,而不是遇到锁定时等待。

因此,具体来说:

如果lNewStuff为null且有锁,则终止线程。 (这该怎么做?)

如果lNewStuff为null并且没有锁,则可以正常运行(已经这样做了)

如果lNewStuff不为null并且有一个锁,则等待锁完成(已经这样做了)

如果lNewStuff不为null并且没有锁,则可以正常运行(已经这样做了)

最佳答案

lNewStuff为null时,您可以使用 Monitor.TryEnter ,并且仅在授予锁定的情况下才继续:

public class Account
{
private readonly object lockThis = new object();

public void ExecuteMe(List<Stuff> lNewStuff)
{
bool lockTaken = false;
try
{
if (lNewStuff == null)
{
// non-blocking - only takes the lock if it's available
Monitor.TryEnter(lockThis, ref lockTaken);
}
else
{
// blocking - equivalent to the standard lock statement
Monitor.Enter(lockThis, ref lockTaken);
}

if (lockTaken)
{
// main code processing
}
}
finally
{
if (lockTaken)
{
Monitor.Exit(lockThis);
}
}
}
}

关于c# - 遇到锁时如何停止线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15127139/

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