我有一个Web服务,使用WCF实现并在IIS7中托管,具有提交 - 轮询通信模式。发出初始请求,该请求快速返回并启动后台进程。客户端轮询后台进程的状态。此接口已设置且无法更改(它是我们依赖的外部服务的模拟)。
我通过向现有服务添加另一个服务合同来实现后台处理,该服务合同具有启动长时间运行流程的单向消息协定。 “后台”服务使数据库保持更新状态,以便与主服务进行通信。这样可以避免创建任何要部署的新Web服务或项目。
问题是后台进程非常耗费CPU,而且似乎正在挨饿其他服务调用。它将占用整个处理器,并且当后台进程的单个实例正在运行时,对主服务的状态轮询调用可能需要一分钟。我不在乎后台进程需要多长时间。
有没有办法限制后台方法的资源使用?或者在WCF中长时间运行异步进程而不更改提交/轮询服务合同的明显方法?如果两个服务仍然在同一台服务器上运行,将它们分成不同的Web服务会有帮助吗?
答案 0 :(得分:2)
我要尝试的第一件事就是降低优先级。
如果您实际上是为了后台工作而单独使用进程,那么您可以这样做:
Process.GetCurrentProcess().PriorityClass = ProcessPriorityClass.BelowNormal;
如果它只是一个背景线程,请改用(从线程内):
Thread.CurrentThread.Priority = ThreadPriority.BelowNormal;
(实际上,最好先启动线程暂停并在运行之前更改调用者的优先级,但通常可以降低自己的优先级。)
至少它应该有助于确定它是否真的是CPU问题。如果在降低优先级后仍然遇到问题,那么可能会出现其他问题,例如文件或网络I / O.