繁体   English   中英

线程安全哈希集

[英]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的任何建议?

我是否正确使用同步锁?

该类是正确的。 资料来源:我。

问题出在其他地方。 我的猜测是发生了以下顺序:

  1. 已新增工作
  2. 工作完成并删除
  3. 添加了相同的作业ID。 在这里,您希望Add返回false,但是删除已完成。

如果是这样,则需要维护另一组具有完整作业ID的文件。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM