繁体   English   中英

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

[英]Processing long-running operations from a windows service

编辑(再次):让我简化我的问题。 我有一个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来查询吗?

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

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

看一下Microsoft消息队列(MSMQ)

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

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

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

每当传入的请求需要服务时,计时器上的主管线程就会生成工作程序。 我使用单独的数据库表进行配置和控制,以便可以在不使服务核心运行的情况下管理服务并从应用程序中暂停主管。 登录到单独的表是查看Web应用程序和本地管理应用程序发生情况的便捷方法。

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

这是一个棘手的问题,也不是一件容易的事…… ThreadPool.QueueUserWorkItem是有关要同时执行一段代码的最简单方法。 我确定您已经知道这一点,因此从技术上讲,您已经回答了自己的问题。

因此,如果这不是一个棘手的问题,那么您是否正在确切地询问如何在ThreadPool.QueueUserWorkItem传递查询?

如果需要考虑将来的可扩展性,那么除了考虑MSMQ的问题外,您还可以考虑使用企业服务总线(ESB)处理这类事情。 查看NServiceBus中的一个.NET示例。

我会使用WWF(4.0):

您可以启动可以在几台机器中处理的长期运行的事务,并行执行任务,故障支持,友好的编码,您可以使用appfabric对其进行管理,它是免费的...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM