当发生许多同时发送请求时,我的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会尝试一次下载所有文件。
答案 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);
}
问题在于,如果系统真的很忙,一个不幸的用户可能会永远等待。对于更严重的应用程序,您可能需要实现排队系统。