首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >导致OutOfMemoryException的ASP.NET MVC控制器线程

导致OutOfMemoryException的ASP.NET MVC控制器线程
EN

Stack Overflow用户
提问于 2017-01-17 02:19:15
回答 1查看 221关注 0票数 0

当同时发生许多get请求时,我的API .NET 4.5.2的控制器内存不足。内存不足来自下载大图像的内存流,这是请求需要执行的处理的一部分。

除了锁定process方法之外,还有什么方法可以减少同时运行的线程的数量吗?IE仅允许同时运行2-3个进程方法..这将允许最大的效率,同时也不会耗尽内存。锁定进程确实解决了内存不足的问题,但一次只允许一个进程使用,这并没有使用所有可用内存,从而减少了运行时间。

每当GET请求进入我的api时,我不确定如何访问或跟踪正在创建的线程。它被部署到Azure服务器上,也许有一个工具可以做到这一点?现在,我一次容纳多个用户的方式是通过扩展到多个实例。

代码语言:javascript
复制
[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试图一次下载所有文件。

EN

回答 1

Stack Overflow用户

发布于 2017-01-19 18:42:52

保持正在处理的图像数量的计数,直到它足够小,以便您的服务器能够处理额外的图像。

Interlocked和try/finally确保在被多个线程更改时保持一致的计数。

代码语言:javascript
复制
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);
}

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41682680

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档