C# 从windows服务处理长时间运行的操作

C# 从windows服务处理长时间运行的操作,c#,multithreading,windows-services,queue,long-running-processes,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

编辑(再次):让我简化我的问题。我有一个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)技术使在不同时间运行的应用程序能够跨异构网络和可能暂时脱机的系统进行通信。MSMQ提供有保证的消息传递、高效的路由、安全性和基于优先级的消息传递。它可以用于实现异步和同步消息传递场景的解决方案


很好地知道,Windows通信基础(WCF)可以利用MSMQ提供的排队服务。

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

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

每当传入的请求需要服务时,计时器上的主管线程就会产生工作线程。我使用一个单独的数据库表进行配置和控制,这样我就可以管理服务并暂停应用程序中的主管,而不必让服务核心运行。登录到一个单独的表是查看web应用程序和本地管理应用程序发生了什么的一种方便方法

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

我将使用WWF(4.0):


您可以启动可以在几台机器上处理的长时间运行的事务,并行执行任务,支持失败,友好的编码,您可以使用appfabric管理它,它是免费的…

这是一个技巧性的问题,或者是一个无脑的问题
ThreadPool.QueueUserWorkItem
是同时执行一段代码的最简单方法。我相信你已经知道了,所以技术上你已经回答了你自己的问题


因此,如果这不是一个技巧性问题,那么您是在询问如何在
线程池.QueueUserWorkItem
中传递查询吗?

我的印象是MSMQ需要相当数量的基础结构。此外,在这种情况下,“谁”将实际执行查询?MSMQ只是中介吗?@intorbit:MSMQ需要安装Windows组件,但很容易让它工作。此外,当你开始使用它的时候,你可以免费获得一堆很棒的功能。是的,MSMQ只是传递消息,您仍然需要手动处理它们。它本身无法进行实际处理,但它消除了在应用程序和服务之间建立通信基础设施的负担。我编辑了我的问题,以降低通信渠道的重要性。不过,我确实计划查看MSMQ,看看它是否可以成为我的解决方案的一部分。即使是暂时的、依赖时间的、非关键性的请求,你认为值得吗?@intoorbit:如果你没有从MSMQ中获得任何好处,那么就不需要了。我不会鼓励你仅仅为了酷而使用一些东西。您可以使用简单的WCF频道。在大多数情况下,只需调用
ThreadPool.QueueUserWorkItem
对工作项进行排队,就可以很好地处理事情。它肯定也可以在Windows服务中使用。我不确定从X个工人的数量来看你到底是什么意思?你的意思是单个请求在X台不同的服务器上处理,或者请求在X台服务器之间进行负载平衡,或者其他什么?我想我一定提出了一个过于复杂的问题。我用一些代码重新表述了一遍,最后一次尝试。我的意思是,如果我“执行一个查询”,它将由一些负载平衡的黑盒处理,结果开始流式返回给我。我想立即向用户返回一个“状态id”,然后立即进行几个查询。真的,这很像Firefox同时下载X文件,你的下载管理器会告诉你每一个文件有多远。是的。。。这正是我打算做的,在我的例子中,我甚至不需要将状态持久化到数据库中。我问这个问题是因为我认为所有生产者/消费者类型的代码都是如此频繁,一定有一些代码或模式已经存在,我可以利用。我想我可能是在这里大声思考,使我的问题看起来比以前更复杂。有很多“建议”说“不要过度使用线程池,尤其是在长时间运行的任务中。”我只是想看看是否有针对我的问题的建议。有人反对使用“长时间运行”线程池中的任务,因为如果一个任务正在等待另一个任务执行某些工作,而该任务正在同一个线程池中等待执行,但线程池已满,则排队的任务可能永远不会执行,并且您将遇到死锁。即使是短时间运行的任务也可能发生这种情况。我认为如果有人有这个问题,那么他们只是错误地设计了他们的程序。。。