从Windows服务处理长时间运行的操作

问题描述:

编辑(再次):让我简化我的问题。我有一个Windows服务,它暴露了一些WCF终端用类似的方法:从Windows服务处理长时间运行的操作

int ExecuteQuery(string query) { 
    // asynchronously execute query that may take 1 second to 20 minutes 
    return queryId; 
} 

string GetStatus(int queryId) { 
    // return the status of the query (# of results so far, etc) 
} 

什么是实现ExecuteQuery方法的最佳方法是什么?我应该打电话ThreadPool.QueueUserWorkItem让我的查询进行吗?

请注意,执行查询后的实际工作是由负载均衡黑匣子完成的。我希望能够同时进行多个查询。

这个比喻是一个网络浏览器,它可以同时下载多个文件,并且你有一个下载管理器可以跟踪每个文件的状态。

要么这是一个技巧性的问题,要么是一件容易的事... ThreadPool.QueueUserWorkItem是当你想同时执行一段代码时最简单的方法。我相信你已经知道了,所以在技术上你已经回答了你自己的问题。

所以,如果这不是一个诡计的问题,那么你是否问到如何通过ThreadPool.QueueUserWorkItem查询?

+0

我想我可能在这里大声思考,并让我的问题看起来比以前更复杂。有很多“建议”表示“不要过度使用ThreadPool,尤其是对于长时间运行的任务”。我只想看看是否有任何针对我的问题的建议。 – intoOrbit 2010-03-10 15:29:33

+1

有一种情绪反对在ThreadPool中使用“长时间运行”的任务,因为如果任务正在等待另一个任务执行某项工作,并且该任务正在等待在同一个ThreadPool中执行,但是ThreadPool已满,那么排队任务可能永远不会被执行,并且会导致死锁。即使在短时间运行的任务中也会发生这种情况我想如果有人遇到这个问题,那么他们只是错误地设计了他们的程序。 – Kiril 2010-03-10 15:51:22

看看Microsoft Message Queuing (MSMQ)

微软消息队列(MSMQ)技术能够在不同时间运行的应用程序跨异构网络和系统可能暂时脱机的沟通。 MSMQ提供有保证的消息传递,有效的路由,安全性和基于优先级的消息传递。它可用于实现异步和同步消息传递场景的解决方案。

很高兴知道Windows Communication Foundation(WCF)可以利用MSMQ提供的排队服务。

+0

我的印象是,MSMQ需要相当数量的基础设施。另外,在这种情况下,“谁”实际上会执行查询? MSMQ只是中介吗? – intoOrbit 2010-03-05 23:22:34

+0

@intoorbit:MSMQ需要安装Windows组件,但它很容易使其工作。此外,当你得到它时,你会获得一堆免费的超棒功能。是的,MSMQ只是提供消息,你仍然需要手动处理它们。它本身不能完成实际的处理,但它消除了在应用程序和服务之间建立通信基础设施的负担。 – 2010-03-06 00:48:26

+0

我编辑了我的问题以减少沟通渠道的重要性。但是,我打算检查MSMQ,看它是否可以成为我的解决方案的一部分。即使是暂时性的,时间依赖性的和非关键性的请求,你认为这是值得的吗? – intoOrbit 2010-03-08 21:29:13

添加到MSMQ答案中,如果考虑到将来的可伸缩性问题,可以考虑使用企业服务总线(ESB)来处理这些类型的事情。查看一个.NET示例的NServiceBus

我使用Windows服务进行非常类似的任务,效果很好。我使用数据库表对请求和响应进行排队,因为它为我提供了一个持久队列,可以通过网络从远程ASP.Net应用程序访问并通过事务进行并发控制。

计时器上的管理程序线程会在接收到的请求需要服务时产生工作人员。我使用单独的数据库表进行配置和控制,以便我可以管理服务并从应用程序暂停管理程序,而无需离开服务核心运行。记录到单独的表格是查看网络应用程序和本地管理应用程序发生情况的便捷方式。

我不会为长时间运行的线程使用ThreadPool,而是创建一个在其自己的线程中运行的工作程序类,并使用回调方法更新具有进度和完成状态的主管。

+0

是的...这几乎是我打算做的,在我的情况下,我甚至不需要将状态持久化到数据库。我问这个问题是因为我认为所有的生产者/消费者类型代码都是经常这样做的,必须有一些代码或模式已经存在,我可以利用。 – intoOrbit 2010-03-08 21:31:23

我会用世界自然基金会(4.0):

你可以开始长期运行的事务,可以是处理在几台机器,在并行,故障支持,友好的编码执行任务,你可以用AppFabric的管理它,它是免费的...