【问题标题】:SignalR hub self-host or not?SignalR 集线器是否自托管?
【发布时间】:2014-05-07 00:17:06
【问题描述】:

我正在开发一个 SignalR 集线器启动 12 个短期运行线程(new Thread())的项目。每个线程使用 websockets 在完成时向客户端报告。这些线程不是 CPU 密集型的,而是从其他 Web 服务获取一些信息。

现在我的困境是:我应该创建一个作为服务运行的独立自托管 signalR 集线器应用程序,还是应该将集线器包含在我的 asp.net MVC 项目中?

最佳性能是什么?

【问题讨论】:

  • 你不应该使用multithreading
  • Damian Edwards 和 David Fowler 在 2013 年伦敦 NDC 上发表的题为“在愤怒中使用 ASP.NET SignalR..”的演讲描述了您想要做什么,并展示了示例代码。 vimeo.com/84677242 大约 27 分钟。

标签: c# asp.net-mvc multithreading signalr


【解决方案1】:

在 .net 4.5 及更高版本中执行此操作的正确方法是执行此操作单线程异步

ASP.Net should NEVER be creating new threads。在 ASP.Net 中显式使用线程时会产生巨大的性能影响。

您还应该知道线程是对有限 CPU 资源的抽象(您通过声明线程不是 CPU 密集型来说明这一点)。从 .net 4.5 开始,这应该告诉您不应该使用线程。 Instead, in this case you should be using a threadless I/O api to call your webservices. 我建议你使用 TAP(又名 async await)模式,它基本上是 .net 4.5。

这应该允许您使用功能中等的机器扩展到数千个并发请求。

如果您具备所有这些,使用 TAP,ASP.Net MVC/IIS 将与大规模并行化和“线程”配合得很好。在这种情况下,我会强烈建议不要使用 Windows 服务,因为使用 IIS 作为引导程序(处理生命周期,并在服务终止时重新启动服务)会有更好的稳定性.

【讨论】:

    【解决方案2】:

    如果性能是一个问题,我会使用 Thread Pool 而不是 new Thread 。

    我将托管一个 Windows 服务,因为这样可以让我更好地控制分配给线程的资源。

    【讨论】:

    • ThreadPool 使用线程池,所以我还不如使用 TPL。有什么优势?那只是使用线程池中的线程...
    • @Dimo 没有。 TPL 不使用线程池。 TPL 不关心使您的任务并行化的内容。 TPL 是一个抽象层和模式库。 Task.Run(随 TPL 提供)使用 ThreadPool,坦率地说,您几乎不应该使用 Task.Run
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-23
    • 2022-09-28
    • 1970-01-01
    • 2015-10-21
    • 2013-07-09
    相关资源
    最近更新 更多