【发布时间】:2017-01-16 18:19:15
【问题描述】:
当许多同时发生的 get 请求发生时,我的 API .NET 4.5.2 的控制器内存不足。内存不足来自下载大图像的内存流,这是请求需要执行的处理的一部分。
除了锁定进程方法之外,还有什么方法可以减少同时运行的线程数量吗? IE 只允许同时运行 2-3 个进程方法。这将允许最大效率,同时也不会耗尽内存。锁定进程确实可以解决内存不足的问题,但一次只允许一个进程没有使用所有可用内存并减少运行时间。
我不确定当 GET 请求进入我的 api 时如何访问或跟踪正在创建的线程。它被部署到 Azure 服务器上,也许有一个工具可以做到这一点?现在,我同时为多个用户提供服务的方式是扩展到多个实例。
[HttpGet]
[Route("example")]
public HttpResponseMessage GetImage([FromUri] ImageParams imageParams){
Image template = Image.FromFile(
System.Web.Hosting.HostingEnvironment.MapPath("~/Content/Images/image.png");
return ProccessImage(imageParams, template);
}
Image.FromFile 行会抛出内存不足,因为 API 会尝试一次下载所有文件。
【问题讨论】:
-
您能告诉我们您正在使用的操作方法吗?至少是图像使用的流。
-
您可以在固定数量的进程运行您的 GET 请求后使用锁。创建一个全局静态计数器,在方法进入时递增(Interlocked.Increment),在退出时递减。如果该计数器达到您的阈值,请使用锁。您可能需要 Monitor.Enter/Monitor.Exit(使用 try/finally)而不是锁。
-
这可以用信号量来完成吗?可以举个代码例子吗?
标签: c# asp.net asp.net-mvc multithreading