我需要构建一个Web应用程序(MVC),它使用第三方win32 dll作为所有业务逻辑的网关(包含登录机制,功能并维护某些状态)。 这个DLL不是为多线程而设计的。在MTA场景中,dll会在一段时间后发生故障。 建议的解决方案是在ASP-Classic模式下运行ASP.NET MVC(使用Asp-CompatHandler的STA)。我成功地尝试了这一切 - 一切运行稳定。 问题是,会有很多并发用户,一些函数调用需要几秒钟(最多10秒!)。如果所有用户互相阻止,这将变得可怕。 在同一个应用程序中最小化阻塞效果的最佳方法是什么?假设只有十个用户应该互相阻止?
如果: ...网络在MTA中运行 ...网络刚刚部署一次 ......一切都在同一个过程中运行
有人能给我一些解决这个问题的好概念吗?
谢谢!马丁
更新 - 找到解决方案: 感谢Ami Bar的“智能线程池”,我可以轻松完成我想要的行为。我实现了一个worker概念(一个特定的用户共享一个worker并在这个worker中相互阻塞),对于每个worker,我现在拥有自己的线程池实例,其中一个线程的最大和最小数量。好吧,它不是一个线程池的想法,但它使得处理工作项很容易,它还有一些很好的其他功能。 Web应用程序现在在MTA上运行。 我将准备一些负载测试,以确定它是否稳定了几个小时。 见这里:http://www.codeproject.com/Articles/7933/Smart-Thread-Pool
答案 0 :(得分:0)
答案很简单,虽然我认为你不会那么喜欢:你不能使用那些不适合在多线程环境中用于多线程环境的东西。
2种可能性:
答案 1 :(得分:0)
不幸的是,如果dll不是设计用于并行请求,则不能将其用于并行请求。
我看到的唯一解决方案就是在没有并行运行应用程序的情况下增加并发用户数量的方法是让多个应用程序实例同时运行,并且可能在它们前面有一个负载均衡器来调度查询