Asp.Net Mvc和Win32 dll,它们不是为多线程设计的



我需要构建一个web应用程序(MVC),该应用程序使用第三方win32 dll作为所有业务逻辑的网关(包含登录机制、功能和维护一些状态)。此dll不是为多线程设计的。在MTA场景中,dll会在一段时间后出错。建议的解决方案是在ASP经典模式下运行ASP.NET MVC(STA使用ASP-CompatHandler)。我成功地尝试了这个——一切都很稳定。问题是,会有很多并发用户,一些函数调用需要几秒钟(最多10秒!)。如果所有用户都互相屏蔽,这将变得非常可怕。在同一应用程序中,最大限度地减少阻塞影响的最佳方法是什么?说只有十个用户应该互相屏蔽?

如果:…web在MTA中运行…web只部署了一次…所有东西都在同一个过程中运行

有人能给我一些解决这个问题的好概念的建议吗?

谢谢!Martin

更新-找到了解决方案:多亏了Ami Bar的"智能线程池",我可以(轻松)完成我想要的行为。我实现了一个工作者概念(特定数量的用户共享一个工作者并在这个工作者中相互阻止),对于每个工作者,我现在都有了自己的线程池实例,最大和最小数量都是一个线程。好吧,这不是线程池的想法,但它使处理工作项变得非常容易,而且它还有一些不错的其他功能。web应用程序现在正在MTA上运行。我将准备一些负载测试,看看它在几个小时内是否稳定。请参见此处:http://www.codeproject.com/Articles/7933/Smart-Thread-Pool

答案很简单,尽管我认为你不会很喜欢:你不能在多线程环境中使用非设计用于多线程环境的东西。

2种可能性:

  • 与STA一起生活
  • 将单线程COM对象替换为要在web应用程序中使用的对象

不幸的是,如果dll不是设计用于并行请求的,则无法将其用于并行请求。

我看到的在不让应用程序并行运行的情况下增加并发用户数量的唯一解决方案是让应用程序的多个实例同时运行,并在它们前面设置一个负载均衡器来调度查询。

最新更新