我正在创建一个webservice + servicebus项目,用户可以在其中执行类似
的操作public void ExecuteLongProcess(DateTime fromDate,string aggregateId){}
此方法立即返回,但通过总线发送操作请求。
当多个用户在另一个已经在运行的同一个aggregateId上请求长进程时,我的问题就开始了。
我正在考虑的解决方案是一个连续运行的任务,并在Queue<LongProcessTask>
中查找必须执行的操作,因此我一次只运行一个进程,或者如果不同,将来的实现将是多个进程aggregateId。
这样我就不会在同一聚合上重叠长时间运行的进程。
其他想法?
答案 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是你的朋友。