问题标签 [windows-services]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - 从 .NET 服务打印
我现在正在处理一个项目,该项目涉及从另一个应用程序接收消息,格式化该消息的内容并将其发送到打印机。选择的技术是 C# windows 服务。我想,输出可以称为报告,但报告引擎不是必需的。一个简单的模板引擎,如 StringTemplate,甚至输出 HTML 的 XSLT 都可以。我遇到的问题是找到一种从服务打印这种输出的免费方法。由于它似乎可以工作,我正在使用 Microsoft 的 RDLC 制作一个原型,填充本地报告,然后将其作为图像呈现到内存流中,然后我将打印出来。问题是:
- 多页打印将是一个大麻烦。
- 仍然必须使用 PrintDocument 来打印内存流,这在 Windows 服务中不受支持(尽管它可能有效 - 原型还没有那么远)
- 如果遇到的数据发生变化,我必须更改数据集和数据被反序列化到的类。坏坏坏。
有没有人不得不远程做这样的事情?有什么建议吗?我已经发布了一个关于在没有用户输入的情况下打印 HTML 的问题,在浪费了大约 3 天之后,我得出的结论是它无法完成,至少不能使用任何免费提供的工具。
感谢所有帮助。
编辑:我们使用 .NET 框架的 2.0 版。
java - 将 Java 应用程序作为 *nix 守护程序或 Windows 服务运行的最佳方法?
我正在寻找将 Java 应用程序作为 *NIX 守护程序或 Windows 服务运行的最佳方法。我查看了Java Service Wrapper、Apache Commons 项目 'jsvc'和Apache Commons 项目 'procrun'。到目前为止,Java Service Wrapper 看起来是最好的选择……但是,我想知道是否还有其他“开源友好”许可产品。
c# - Windows 服务增加 CPU 消耗
在我的工作中,我负责使用 C# 2003 编写的六个 Windows 服务。这些服务中的每一个都包含一个计时器,它每分钟左右触发一次,它们的大部分工作都发生在这里。
我的问题是,随着这些服务的运行,它们开始通过循环的每次迭代消耗越来越多的 CPU 时间,即使它们没有有意义的工作要做(即,它们只是闲置,浏览数据库做某事)。当它们启动时,每个服务平均使用(大约)4 个 CPU 的 2-3%,这很好。24 小时后,每个服务将在其循环运行期间消耗整个处理器。
任何人都可以帮忙吗?我不知道是什么原因造成的。我们当前的解决方案是每天重新启动一次服务(它们会自行关闭,然后脚本会看到它们处于脱机状态并在凌晨 3 点左右重新启动它们)。但这不是一个长期的解决方案;我担心的是,随着服务变得越来越忙,每天重新启动一次可能还不够……但是由于启动会受到很大的损失(它们都使用 NHibernate 进行数据访问),随着它们变得越来越忙,这正是我们没有的想要做的是更频繁地重新启动它们。
@akmad:的确,这非常困难。
- 是的,独立运行的服务会随着时间的推移显示相同的症状。
- 不,它没有。我们已经看过了。这可能发生在上午 10 点或下午 6 点或半夜。没有一致性。
- 我们的确是; 他们是。这些服务正在做他们应该做的,没有别的。
- 不幸的是,这需要预先知道服务何时会用尽 CPU,这发生在不可预知的时间表上,而且永远不会很快……这使事情变得更加困难,因为我的老板会在它们开始运行并重新启动它们时问题而不考虑调试问题。
- 不,他们使用相当一致的 RAM 量(每个大约 60-80MB,机器上的 4GB)。
很好的建议,但请放心,我们已经尝试了所有常见的故障排除方法。我希望这是一个有人可能知道的 .NET 问题,我们可以努力解决。我老板的解决方案(我特别不想实施)是在数据库中放置一个字段,该字段包含多次,以便白天重新启动服务,这样他就可以让问题消失而不去想它. 我正在拼命寻找真正问题的原因,以便我能够解决它,因为这个解决方案将在大约六个月内变成一场灾难。
@Yaakov Ellis:它们每个都有不同的功能。一个从异地某处的 Oracle 数据库中读取记录;另一个处理这些记录并将属于这些记录的文件传输到我们的系统;第三个检查这些文件以确保它们是我们所期望的;另一个是维护服务,它不断检查磁盘空间(我们有足够的空间)并轮询其他服务器以确保它们处于活动状态;一个运行只是为了确保所有这些其他的都在运行并完成它们的工作,监视和报告错误,并重新启动任何未能保持整个系统一天 24 小时运行的任何东西。
所以,如果你问我认为你在问什么,不,所有这些服务都没有一件常见的事情(除了通过 NHibernate 访问数据库),我可以指出这是一个潜在的问题。不幸的是,如果事实证明这是真正的问题(这不会让我大吃一惊),整个事情可能会被搞砸——我最终会用简单的 SQL 重写所有这些。我希望这是一个垃圾收集器问题或者比 NHibernate 更容易处理的问题。
@Joshdan:没有秘密。正如我所说,我们已经尝试了所有常见的故障排除方法。分析没有帮助:当 CPU 使用率很高时,我们使用的分析器无法指向任何实际执行的代码。大约一个月前,这些服务在寻找这个问题时被拆散了。分析每一段代码,试图找出我们的代码是否是问题所在;我不在这里问,因为我还没有完成我的作业。如果这是一个简单的案例,即服务所做的工作比预期的要多,那就会被抓住。
这里的问题是,大多数时候,服务根本没有做任何事情,但仍然设法消耗 25% 或更多的四个 CPU 内核:它们没有工作要做,退出循环并等待下一次迭代。从字面上看,这应该几乎不需要 CPU 时间。
这是我们看到的行为示例,在两天内没有工作的服务上(在不变的环境中)。这是上周捕获的:
第 1 天,早上 8 点:平均。CPU 使用率约 3%
第 1 天,下午 6 点:平均。CPU 使用率约 8%
第 2 天,早上 7 点:平均。CPU 使用率约 20%
第 2 天,上午 11 点:平均。CPU使用率约30%
在查看了所有可能的世俗原因之后,我在这里提出了这个问题,因为我认为(事实证明是正确的)我会得到更多创新的答案(比如 Ubiguchi 的),或者指向我没有的事情的指针'没想到(就像伊恩的建议)。
那么 CPU 峰值是在定时器回调之前、在定时器回调中还是在定时器回调之后立即发生?
你误会了。这不是一个尖峰。如果是,就没有问题;我可以处理尖峰。但它不是...... CPU使用率普遍上升。即使服务什么也不做,等待下一个计时器命中。当服务启动时,一切都很平静,图表看起来就像你所期望的那样......通常,使用率为 0%,当 NHibernate 访问数据库或服务执行一些微不足道的工作时,使用率会飙升至 10% . 但这会在进程运行时始终增加 25% 的使用率(如果我让它走得太远的话会更多)。
这使得 Ian 的建议成为合乎逻辑的灵丹妙药(当您不注意时, NHibernate 会做很多事情)。唉,我已经实施了他的解决方案,但它没有产生效果(我没有证据证明这一点,但我实际上认为这让事情变得更糟......平均使用量似乎现在上升得更快)。请注意,删除 NHibernate“部分”(如您所推荐)是不可行的,因为这将删除服务中大约 90% 的代码,这将让我排除计时器问题(我绝对打算尝试),但不能帮助我排除 NHibernate 的问题,因为如果 NHibernate 导致了这种情况,那么实施的狡猾修复(见下文)将不得不成为系统工作的方式;我们在这个项目中非常依赖 NHibernate,以至于 PM 根本不会接受它会导致无法解决的结构性问题。
我刚刚注意到这个问题有一种绝望的感觉——除非出现小奇迹,否则你的问题将继续存在
不要让它以这种方式脱落。目前,这些服务每天都在重新启动(可以选择输入一天中的任意小时数让它们关闭和重新启动),这可以解决问题,但一旦进入生产机器就不能成为长期解决方案并开始变得忙碌。无论是我修复它们还是 PM 对它们保持这种约束,这些问题都不会继续存在。显然,我更愿意实施真正的修复,但由于最初的测试没有发现原因,而且服务已经经过广泛审查,PM 宁愿让它们重新启动多次,也不愿花更多时间尝试修复它们. 这完全超出了我的控制,让你所说的奇迹变得比其他情况更重要。
这非常有趣(只要您信任您的分析器)。
我不。但是,这些是用 .NET 1.1 编写的 Windows 服务,在 Windows 2000 机器上运行,由一个狡猾的 Nant 脚本部署,使用旧版本的 NHibernate 进行数据库访问。那台机器上几乎没有我会说我信任的东西。
.net - 使用 InstallUtil 安装 .NET 服务
我正在尝试安装我编写的 .NET 服务。根据 MSDN 的建议,我正在使用 InstallUtil。但是我错过了如何在命令行甚至服务本身中设置默认服务用户。现在,当 InstallUtil 运行时,它将显示一个对话框,要求用户提供用户的凭据。我正在尝试将服务安装集成到更大的安装中,并且需要服务安装保持静默。
c - 在没有 Visual Studio 的情况下创建 Windows 服务
因此,使用 Visual Studio 创建 Windows 服务相当简单。我的问题更深入一点,即究竟是什么使可执行文件可作为服务安装以及如何将服务编写为直接的 C 应用程序。我找不到很多关于此的参考资料,但我假设必须有一些我可以实现的接口,以便我的 .exe 可以作为服务安装。
c# - 如何对 Windows 服务进行单元测试?
.NET 框架:2.0 首选语言:C#
我是 TDD(测试驱动开发)的新手。
首先,是否可以对 Windows 服务进行单元测试?
Windows 服务类派生自 ServiceBase,它具有可覆盖的方法,
- 启动
- 停车
我怎样才能触发这些方法被调用,就好像单元测试是一个以正确顺序调用这些方法的实际服务一样?
在这一点上,我什至在做单元测试吗?还是集成测试?
我看过 WCF 服务问题,但这对我来说没有任何意义,因为我从未处理过 WCF 服务。
.net - Windows 服务中未处理的异常过滤器
我正在创建一个 Windows 服务,并想知道这方面的最佳实践。在我的所有 Windows 程序中,我都有一个表单询问用户是否要报告错误,如果他回答是,我在 FogBugz 中创建了一个案例。我应该在 Windows 服务中做什么。
windows - 如何将 Windows GUI 应用程序作为服务运行?
我有一个应该作为服务实现的现有 GUI 应用程序。基本上,我需要能够远程登录和注销 Windows 2003 服务器,并且仍然保持该程序运行。
这甚至可能吗?
编辑:这里进一步细化......我没有来源,这不是我的应用程序。
wcf - 如何在 1 个 Windows 服务中托管 2 个 WCF 服务?
我有一个 WCF 应用程序,它有两个服务,我试图使用 net.tcp 在单个 Windows 服务中托管它们。我可以很好地运行任何一个服务,但是一旦我尝试将它们都放在 Windows 服务中,只会加载第一个服务。我已经确定正在调用第二个服务 ctor,但 OnStart 永远不会触发。这告诉我 WCF 在加载第二个服务时发现了一些问题。
使用 net.tcp 我知道我需要打开端口共享并在服务器上启动端口共享服务。这一切似乎工作正常。我尝试将服务放在不同的 tcp 端口上,但仍然没有成功。
我的服务安装程序类如下所示:
两种服务看起来都非常相似
.net - .Net Windows 服务中的 UnhandledException 处理程序
是否可以在 Windows 服务中使用 UnhandledException 处理程序?
通常我会使用一个自定义构建的异常处理组件来进行日志记录、电话回家等。这个组件向 System.AppDomain.CurrentDomain.UnhandledException 添加了一个处理程序,但据我所知,这并没有取得任何成就,因此赢得了 Windows 服务我最终在我的 2 个(或 4 个)服务入口点中使用了这种模式:
有没有办法我的自定义异常处理组件可以更好地处理这个问题,这样我就不必用混乱的异常处理管道填充我的 OnStart 了?