ASP.NET MVC Controller线程导致OutOfMemoryException

时间:2017-01-16 18:19:15

标签: c# asp.net asp.net-mvc multithreading

当发生许多同时发送请求时,我的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会尝试一次下载所有文件。

1 个答案:

答案 0 :(得分:1)

保持对正在处理的图像数量的计数,并等待它足够小,以便服务器处理其他图像的处理。

Interlocked并尝试/最终确保在多个线程更改时计数保持一致。

private static int _count = 0;

...

// Wait until other images have finished processing
while (_count >= 4)
{
    Thread.Sleep(200);
}

try
{
    Interlocked.Increment(ref _count);

    // Process it now
    Image template = Image.FromFile(MapPath("~/Content/Images/image.png");

    return ProccessImage(imageParams, template);    
}
finally
{
    Interlocked.Decrement(ref _count);
}

问题在于,如果系统真的很忙,一个不幸的用户可能会永远等待。对于更严重的应用程序,您可能需要实现排队系统。