我有一个(经典(云服务,需要创建一个昂贵的对象,我想在后续请求中重复使用。创建需要很长时间,因此每次都无法接受时创建它。
public class MyService : IHttpHandler
{
public static ExpensiveObject MyObject;
public void ProcessRequest(HttpContext context)
{
if (MyObject == null)
MyObject = new ExpensiveObject(); // very time consuming operation
// do stuff with MyObject
}
}
(我意识到对运行多个并发请求缺乏考虑,请忽略这一点(当我发布两个请求时,一个接一个地,每次都会创建一个新的MyObject
。我如何确保它重用为每个请求创建的相同对象?
设置IsReusable
在MyService
中返回true似乎没有区别。
看起来您需要将共享对象从httphandler移出到单独的托管服务,例如Azure App Service,Azure WebJob(不适合所有使用的情况(等等
Azure应用服务方案:Web应用程序通过HTTP与应用服务通信(请参阅HTTPCLEINT(。Azure App Service具有配置选项,即使没有流量,也可以将应用程序加载。
如果您处理长期运行的操作(尽管您写了这个问题是长期的(,那么请查看标准的Rest-Pattern解决此类问题 - 民意调查。
也许此链接对您有用:云服务角色回收的常见原因。
如果您在IIS 内部运行。应用程序池在工作。此外,多个请求通常不会在过程中交叉路径。
您的典型选项包括以下内容。每个线程只会创建一个昂贵的服务:
- IOC注册该服务的每个线程生命周期(或请求范围(。
- 单身人士(已经使用的应用程序池(
- 最佳!
可以轻松实现此目标(不处理Arcane Azure Crap(,我刚刚制作了一个单独的可执行文件,该可执行文件可在Nancy Localhost服务器中托管ExpensiveObject
(以启动脚本启动(。
在我的情况下,这没有明显的缺点,因为我只需要请求对象即可消耗字符串并返回另一个字符串。但是,这可能不是每个人的正确解决方案。