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

时间:2010-03-05 21:43:27

标签: c# multithreading windows-services queue long-running-processes

编辑(再次):让我简化我的问题。我有一个Windows服务,它使用以下方法公开一些WCF端点:

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来查询我的查询吗?

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

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

5 个答案:

答案 0 :(得分:3)

看看Microsoft Message Queuing (MSMQ)

  

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

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

答案 1 :(得分:1)

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

当传入的请求需要服务时,计时器上的主管线程会产生工作线程。我使用单独的数据库表进行配置和控制,以便我可以管理服务并从应用程序中暂停管理程序,而无需保持服务核心运行。登录到单独的表格可以方便地查看网络应用程序和本地管理员应用程序发生的情况。

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

答案 2 :(得分:1)

无论是一个技巧问题还是一个简单的问题...... ThreadPool.QueueUserWorkItem是关于当你想要同时执行一段代码时最简单的方法。我相信你已经知道了,所以从技术上来说,你已经回答了自己的问题。

因此,如果这不是一个技巧问题,那么您是否正在询问如何在ThreadPool.QueueUserWorkItem中传递查询?

答案 3 :(得分:0)

如果需要考虑未来的可扩展性,那么您可以考虑使用企业服务总线(ESB)来处理这些类型的事情。查看NServiceBus以获取一个.NET示例。

答案 4 :(得分:0)

我会使用WWF(4.0):

你可以开始长时间运行的交易,可以在几台机器上处理,并行执行任务,失败支持,友好编码,你可以用appfabric管理它,它是免费的......