长时间运行过程互锁

时间:2011-10-31 11:39:11

标签: c# servicebus long-running-processes

我正在创建一个webservice + servicebus项目,用户可以在其中执行类似

的操作
public void ExecuteLongProcess(DateTime fromDate,string aggregateId){}

此方法立即返回,但通过总线发送操作请求。

当多个用户在另一个已经在运行的同一个aggregateId上请求长进程时,我的问题就开始了。

我正在考虑的解决方案是一个连续运行的任务,并在Queue<LongProcessTask>中查找必须执行的操作,因此我一次只运行一个进程,或者如果不同,将来的实现将是多个进程aggregateId。

这样我就不会在同一聚合上重叠长时间运行的进程。

其他想法?

2 个答案:

答案 0 :(得分:0)

我创建了一个TaskRunner,它实例化一些连续运行的Task(编号取决于处理器核心),它查找并发队列并运行每个挂起的操作。 TaskRunner从Windsor获取每个操作类型的处理程序,以便将每个操作的处理留在一个类中。

答案 1 :(得分:0)

在你的回答中,你说多个线程将从并发队列中获取任务。在这种情况下,具有相同aggregateId的两个任务可能同时运行。我不知道这对你来说是否有问题,如果是,那么你必须为每个aggregateId使用不同的队列。

如果任务顺序不是问题,那么我建议使用BlockingCollection。因为存在疑问:如果并发队列中没有任务,您打算如何处理多个使用者线程?

while(some_condition_to_keep_thread_alive)
{
  if(!queue.TryDequeue(...))
    continue;
  else 
  {
    //do the job
  }
}

如果queue为空,此代码将使您的核心变得疯狂。你需要一个阻止机制。 BlockingCollection将为您完成此任务。

你坚持使用ConcurrentQueue吗?好的SemaphoreSlim是你的朋友。