2017-01-16 1 views
0

多くの同時取得要求が発生している場合、API .NET 4.5.2のコントローラでメモリ不足が発生しています。メモリ不足は、大きな画像をダウンロードするメモリストリームから発生します。これは、要求が処理する必要がある処理の一部です。OutOfMemoryExceptionを引き起こすASP.NET MVCコントローラスレッド

プロセスメソッドをロックする以外に、同時に実行されるスレッドの量を減らす方法はありますか? IEは同時に2〜3のプロセスメソッドを実行することができます。これにより、メモリーを使い果たしていないときに最大限の効率が得られます。プロセスをロックするとメモリが不足する問題を解決できますが、使用可能なメモリをすべて使用していないプロセスを1つずつ許可し、実行時間を短縮します。

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行にメモリ不足がスローされます。

+0

使用している操作方法を教えてもらえますか?少なくとも画像が使用しているストリーム。 – krillgar

+0

編集中に完了 – Jaked222

+0

固定数のプロセスがGET要求を実行した後にロックを使用できます。メソッドエントリの(Interlocked.Increment)をインクリメントし、終了時にデクリメントするグローバルスタティックカウンタを作成します。そのカウンタがしきい値に達した場合は、ロックを使用します。ロックの代わりにMonitor.Enter/Monitor.Exit(try/finallyを使用)が必要な場合があります。 –

答えて

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); 
} 

この問題は、システムが本当に忙しい場合には不運なユーザーがいつまでも待つことができるということです。より深刻なアプリケーションでは、キューイングシステムを実装する必要があります。

関連する問題