使用 Windows 服务进行多任务处理

Posted

技术标签:

【中文标题】使用 Windows 服务进行多任务处理【英文标题】:Multitasking with windows service 【发布时间】:2019-03-27 03:36:41 【问题描述】:

我需要从一个 Windows 服务并行运行 6 到 8 个同一个控制台应用程序实例,任何实例中的异常都不应导致主服务停止。 每个实例将使用唯一的 AD 帐户使用 REST Web 服务,实例将需要单独的配置信息来初始化自己。 Windows 服务将为所有用户运行(即使未登录),也可以使用一个服务帐户运行。 我的问题是在上述情况下要考虑什么因素

    我应该使用多线程还是启动多进程 是否需要使用应用程序域隔离每个进程? 是否需要在启动每个实例之前分配 GUID? 我应该遵循哪些最佳做法? 如何保持对实例的最佳控制,例如,如果一个实例未完成或挂起,而另一个应继续服务?

【问题讨论】:

您想根据请求动态启动子控制台并使其能够使用该服务,还是需要 Windows 服务来启动子控制台?如果是之前,我建议使用 Windows 服务来托管 WCF 服务,然后创建一个可以动态连接/断开该服务的 WCF 客户端控制台应用程序。 WCF 为会话提供架构(如果您使用网络管道/远程登录/等作为端点)。否则,请提供有关您/用户打算如何与所述应用程序交互的更多详细信息。 是的,我需要动态创建实例。 好的,那么我的建议是研究 WCF 以及如何在 Windows 服务中托管 WCF 服务。在线阅读一些简单的教程,尤其是 MSDN 上的教程,您将在不知不觉中启动并运行。获得服务后,Visual Studios 可以为您自动生成所有客户端代理。 【参考方案1】:
    我应该使用多线程还是启动多进程

如果你想要这个并发,如果你需要等待每个完成,这是你唯一的选择,是的,它很好(一开始)

    是否需要使用应用程序域隔离每个进程?

不,它们是一个单独的进程,除非它们选择使用共享资源,否则它们已经被隔离了。

    是否需要在启动每个实例之前分配 GUID?

我不知道,您为什么需要 GUID?你告诉我们

    我应该遵循哪些最佳做法?

最佳做法是不要多次运行控制台应用。我不应该将功能放入代码中,并掌握它的功能和方式。

    如何保持对实例的最佳控制,例如,如果一个实例未完成或挂起,而另一个应继续服务?

这完全是您的实现细节。如果这些进程挂起,那么您可能需要终止它们。至于怎么控制呢? TPL、任务、线程、CancellationTokens、定时器,这取决于你..

更新

您是否投票支持多进程而不是多线程?我想明白 使用 PROC 和启动有什么优点或缺点 多个 exe 使用并行线程。哪一个更好。只是 更新实例不会命中任何通用文件系统(文件夹)。和 App Domain 将如何发挥作用?

他们都有优势。

独立进程与它们共享的操作系统资源完全分开。与单独的应用程序域类似,它与您可以创建一个 .net 结构一样隔离。如果您需要完全隔离,则可能需要考虑单独的流程。

单独进程的缺点是您不能轻易地分配和分配资源。

在一个 appDomain 和单个进程下,您可以利用 TPL 并更好地分配线程和 CPU 和资源。也就是说,你对正在发生的事情有更细粒度的控制,你不会面临低效的线程饥饿和饱和的风险,更容易调试,更容易管理和维护,更容易记录,更容易启动停止和cancel,容错性更强。单个流程还有很多好处,但我认为您明白了。

【讨论】:

感谢您的回复,这是有道理的,我可以将应用程序转换为使用 DLL lib 而不是控制台 (exe) 应用程序。但我有进一步的疑问,你是否投票支持多线程而不是多进程?我想了解使用 PROC 和使用并行线程启动多个 exe 的优点或缺点是什么。哪一个更好。只是一个更新实例不会碰到任何常见的文件系统(文件夹)。以及 App Domain 将如何发挥作用?

以上是关于使用 Windows 服务进行多任务处理的主要内容,如果未能解决你的问题,请参考以下文章

winscp怎么后台多任务上传文件

Python 3多处理 - 如何执行单个任务

由于有了操作系统,同一瞬间可以有多个程序执行对不对?

Future配合线程池进行多线程任务并返回结果

PHP多进程处理并行处理任务实例

用于调度代码重复运行的 Windows 任务调度程序有多可靠?