确保长时间运行的任务仅被触发一次,后续请求排队但队列中只有一个条目

Dog*_*ars 5 .net c# multithreading asynchronous async-await

我有一个计算密集型方法Calculate可能会运行几秒钟,请求来自多个线程.

Calculate应执行一个,后续请求应排队,直到初始请求完成.如果已经排队了请求,则可以丢弃后续请求(因为排队的请求就足够了)

似乎有很多潜在的解决方案,但我只需要最简单的解决方案.

更新:这是我的基本尝试:

private int _queueStatus;
private readonly object _queueStatusSync = new Object();

public void Calculate()
{
    lock(_queueStatusSync)
    {
        if(_queueStatus == 2) return;
        _queueStatus++;
        if(_queueStatus == 2) return;
    }
    for(;;)
    {
        CalculateImpl();
        lock(_queueStatusSync)
            if(--_queueStatus == 0) return;

    }
}

private void CalculateImpl()
{
    // long running process will take a few seconds...
}
Run Code Online (Sandbox Code Playgroud)

Yuv*_*kov 0

这听起来像是一个经典的生产者-消费者。我建议调查一下BlockingCollection<T>。它是System.Collection.Concurrent命名空间的一部分。最重要的是,您可以实现排队逻辑。

您可以提供BlockingCollection任何内部结构来保存其数据,例如 a等ConcurrentBag<T>ConcurrentQueue<T>后者是使用的默认结构。