c# - 我们应该使用 Windows 服务还是线程池?

标签 c# vb.net multithreading asp.net-mvc-4 windows-services

我们正在为数百名用户开发 Asp.Net MVC 4 网络应用程序。

我们需要有一个后台服务每个用户以几分钟的间隔工作。

我们不确定是使用 Windows 服务(多个 Windows 服务)还是使用进程的线程池。我们认为 Windows 服务是因为它们可以通过 Windows 服务器轻松维护,并且这种方法可以节省编程 UI 和管理线程的开销。它还可以轻松地在一段时间内运行。

Windows 服务 是否可以为刚刚注册的新用户自动启动一个新实例(因此我们有多个后台 windows 服务实例,每个用户一个)?如果不是,则 Windows 服务 选项失败。

如果上层可行,我们应该选择Windows 服务 方法还是自己管理进程的线程池

最佳答案

当然,当您进入 1000s 时,每个用户启动一个进程可以保证您的高内存开销和不可扩展性。我看不出启动一个进程(而不是一个线程)可能会节省什么,因为新进程将至少包含一个线程。此外,Windows 服务与“登录用户”无关。它们不适用于多实例。

You seem to want to run background work in ASP.NET MVC.请注意,这很难。在这里使用 一个 Windows 服务很有意义。

后台工作的困难之处在于,工作进程可能会因多种原因退出。你必须容忍这一点。一个服务有同样的问题:需要部署新版本并定时重启服务器。您还需要 HA 策略,因此您需要多台服务器。

即使对于长时间运行的后台工作,我也不相信 Windows 服务会是更好的选择。

如果有 100 多个并发后台工作人员,您可能应该使用异步 IO 来避免 100 多个线程的专用。

我假设您的后台工作大部分时间都在等待。您可以使等待异步(使用计时器)和所有其他同步。这为您提供了一个简单的实现并大大节省了内存使用量。

关于c# - 我们应该使用 Windows 服务还是线程池?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24486409/

相关文章:

c# - DataTable按索引将选定的行和列复制到另一个DataTable

c# - 在 Orchard CMS 中使用 Document.cshtml 的替代品

vb.net - VB中如何实现大于X小于Y?

c# - 访问DependencyProperty : The calling thread cannot access this object because a different thread owns it

c# - GetHashCodes - 如何以及何时使用它?

c# - MVC 应用程序中的作业调度

xml - 带有命名空间的 VB 2010 XML 文件导致问题

javascript - 在 asp.net 中将复选框选定的值插入文本框?

C# 任务线程池 - 仅在 10 个线程中运行 100 个任务

javascript - 如何仅一次要求Web Worker文件