0

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

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

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

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

我正在考虑的解决方案是一个连续运行的任务,并寻找一个Queue<LongProcessTask>必须执行的操作,所以我一次只运行一个进程,或者如果不同的聚合 ID,未来的实现将是多个进程。

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

其他想法?

4

2 回答 2

0

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

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

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

queue如果为空,此代码将使您的核心发疯。你需要一个阻塞机制。BlockingCollection 将为您执行此操作。

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

于 2011-11-03T10:06:38.287 回答
0

I have created a TaskRunner that instantiate some continuous running Task (number depending on processor cores) that look in a concurrent queue and run each operation pending. TaskRunner get from Windsor the handler for each operation type in order to leave the processing of each operation in a class aside.

于 2011-11-03T09:19:47.770 回答