gpt4 book ai didi

c# - 阻止并发访问线程池

转载 作者:行者123 更新时间:2023-11-30 17:15:53 24 4
gpt4 key购买 nike

因此,我正在运行一个查询并使用一个名为 StartJob 的函数处理并发返回的行,该函数将在我的作业 上运行:

ThreadPool.QueueUserWorkItem(StartJob, job);

效果很好,而且速度非常快。但现在我被告知,当查询返回时,某些行可能具有相同的 job.UserID 值,并且我们不能为相同的 job.UserID 值同时运行 StartJob 函数。问题是:如何让 StartJob 阻止执行,直到具有相同 UserID 的任何其他 StartJob 实例完成?

我确定有某种方法可以获取每个用户 ID 的锁,但我不知道该怎么做。感谢您的帮助。

最佳答案

HashSet<int> hs = new HashSet<int>(); // In common with all the threads

int id = 1; // Your id

// This is the body of your Thread. You pass it the id as you want.
// A closure on it, or as a parameter of the thread.

// This will begin with short spins, every time trying to add the id to the hashset.
// SpinUntil stops when the lambda function returns true.
SpinWait.SpinUntil(() =>
{
lock (cd)
{
return hs.Add(id);
}
});

// OR, if you know the operation is slow, or < .NET 4.0

// This is clearer. The thread yields until it can add the id to the hashset.
while (true)
{
lock (hs)
{
if (hs.Add(id))
{
break;
}
}

Thread.Yield();
}

// End of the variant

// Remember the try/finally! It's important in case of exceptions!!!
try
{
// Put here your code
// Put here your code
// Put here your code
}
finally
{
lock (hs)
{
hs.Remove(id);
}
}

两个版本,一个适用于简称 StartJob 并且仅适用于 .NET 4.0,一个适用于 .NET >= 3.5。

很明显,hs 是所有线程共有的,idjob.UserID

我要补充一点,在 .NET 4.0 下,您可以使用 SpinLock 而不是 lock。它的速度稍快一些,但它的语法有点棘手。

关于c# - 阻止并发访问线程池,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7673677/

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