当同时发生许多get请求时,我的API .NET 4.5.2的控制器内存不足。内存不足来自下载大图像的内存流,这是请求需要执行的处理的一部分。
除了锁定process方法之外,还有什么方法可以减少同时运行的线程的数量吗?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);
}内存不足会在API行抛出,因为Image.FromFile试图一次下载所有文件。
发布于 2017-01-19 18:42:52
保持正在处理的图像数量的计数,直到它足够小,以便您的服务器能够处理额外的图像。
Interlocked和try/finally确保在被多个线程更改时保持一致的计数。
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);
}这样做的问题是,如果系统真的很忙,一个不幸的用户可能会永远等待。对于更严重的应用程序,您可能需要实现排队系统。
https://stackoverflow.com/questions/41682680
复制相似问题