[英]Thread safe Hash Set
我有几个线程负责处理作业。 为了防止作业选择相同的作业,请与以下类别进行协调:
public class CurrentlyProcessingCollection
{
private readonly HashSet<string> _currentlyProcessing = new HashSet<string>();
private readonly object _myLock = new object();
public bool TryAdd(string id)
{
return SynchronisedContext(
() =>
{
return _currentlyProcessing.Add(id)
});
}
public void Remove(string id)
{
SynchronisedContext(() => _currentlyProcessingFiles.Remove(id));
}
private T SynchronisedContext<T>(Func<T> function)
{
lock (_myLock)
{
return function();
}
}
}
如果TryAdd(id)
返回false,则该过程将忽略该作业,并移至下一个作业。 作业完成后,它将从列表中删除。
不幸的是,这不是一直发生的情况,我偶尔会处理两次作业(非常糟糕)。 问题可能出在代码的其他地方,每个线程决定是否使用以下代码来摩擦作业:
var jobs = GetJobs();
foreach (var job in jobs)
{
var tryAdd = CURRENT_FILES.TryAdd(job);
if (tryAdd)
{
ImportFile(job);
}
}
有一个Remove(job)
方法,我想看看是否有任何可以过早调用的方法,尽管由于作业是经过处理后移到另一个目录的文件,所以不太可能。
关于TryAdd(id)
如何多次返回true的任何建议?
我是否正确使用同步锁?
该类是正确的。 资料来源:我。
问题出在其他地方。 我的猜测是发生了以下顺序:
Add
返回false,但是删除已完成。 如果是这样,则需要维护另一组具有完整作业ID的文件。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.