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)
这听起来像是一个经典的生产者-消费者。我建议调查一下BlockingCollection<T>。它是System.Collection.Concurrent命名空间的一部分。最重要的是,您可以实现排队逻辑。
您可以提供BlockingCollection任何内部结构来保存其数据,例如 a等ConcurrentBag<T>。ConcurrentQueue<T>后者是使用的默认结构。
| 归档时间: |
|
| 查看次数: |
634 次 |
| 最近记录: |