c# - 结合 ConcurrentQueue 和 ConcurrentStack

标签 c# .net multithreading collections

我正在寻找可以从两侧访问的并发集合。我想实现以下目标:

  • 一些生产者添加项目
  • 客户端应该能够显示最后 n 个生产的项目
  • 集合应仅包含最近 x 小时内生成的元素

所以我需要访问列表的顶部 (FIFO) 以显示最后的 n 个项目,但我还需要访问列表的末尾 (LIFO) 以修剪早于 <连续 em>x 小时。

最佳答案

另一种方法是使用 MemoryCache 类,它是线程安全的,并提供用于删除“过期”项目的内置功能。<​​/p>

我创建了一个类来保存保存的值和时间戳

public class SavedItem<T>
{
    public DateTime Timestamp { get; set; }

    public T Value { get; set; }
}

Collection 类将有两种方法:一种用于添加,一种用于检索 N 量的最后一项

public class ExpiredCollection
{
    private readonly MemoryCache _cache;

    private readonly int _hoursLimit;

    public ExpiredCollection(int hoursLimit)
    {
        _cache = new MemoryCache("sample");
        _hoursLimit = hoursLimit;
    }

    public void Add<T>(T value)
    {
        var item = CreateCacheItem(value);
        var policy = CreateItemPolicy();

        _cache.Add(item, policy);
    }

    private CacheItem CreateCacheItem<T>(T value)
    {
        var addedValue = new SavedItem<T>
        {
            Timestamp = DateTime.Now,
            Value = value
        };
        // Create unique key to satisfy MemoryCache contract
        var uniqueKey = Guid.NewGuid().ToString();

        return new CacheItem(uniqueKey, addedValue);
    }

    private CacheItemPolicy CreateItemPolicy()
    {
        // This will set a time when item will be removed from the cache
        var expirationTime = DateTime.Now.AddHours(_hoursLimit);
        var offset = new DateTimeOffset(expirationTime);

        return new CacheItemPolicy
        {
            AbsoluteExpiration = offset
        };
    }

    public IEnumerable<T> GetLast<T>(int amount)
    {
        return _cache.Select(pair => (SavedItem<T>)pair.Value)
                     .OrderBy(item => item.Timestamp)
                     .Select(item => item.Value)
                     .Take(amount);
    }
}

关于c# - 结合 ConcurrentQueue 和 ConcurrentStack,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50113299/

相关文章:

c# - 在 IIS 中运行时出现 Swashbuckle 错误 - 404( 'swagger.json')

c# - 保护 .NET 中的试用版

asp.net - 使用 powershell 将 .NET Framework 从 4.5 升级到 4.6

c# - 将禁用的 TextBox 的 ForeColor 设置为与其在 C# 中的 BackColor 相同

android - VS 和 MonoDevelop 代码共享

java - 带有线程池的服务框架

multithreading - VBScript线程

c# - 以用户身份从键盘在 Windows 窗体中导入值

c# - 优化Entity框架Query,避免延迟加载

c# - webClient.DownloadDataCompleted 事件