0

我需要构建一个 Web 应用程序 (MVC),它使用第三方 win32 dll 作为所有业务逻辑的网关(包含登录机制、功能和维护一些状态)。此 dll 不是为多线程设计的。在 MTA 方案中,dll 在一定时间后发生故障。推荐的解决方案是在 ASP-Classic 模式下运行 ASP.NET MVC(STA 使用 Asp-CompatHandler)。我成功地尝试了这个 - 一切运行稳定。问题是,会有很多并发用户,一些函数调用需要几秒钟(最多 10 秒!)。如果所有用户互相阻止,这将变得可怕。在同一应用程序中最小化阻塞效应的最佳方法是什么?说只有十个用户应该互相阻止?

最好是: ...网络在 MTA 中运行 ...网络只需部署一次 ...一切都在同一个进程中运行

谁能给我一些建议来解决这个问题?

谢谢!马丁

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

4

2 回答 2

0

不幸的是,如果 dll 不是为并行请求而设计的,则不能将它用于并行请求。

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

于 2012-09-24T11:13:46.983 回答
0

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

2种可能性:

  • 与 STA 一起生活
  • 将单线程 COM 对象替换为打算在 Web 应用程序中使用的对象
于 2012-09-24T11:11:03.003 回答