public EnginesPool(int enginesCount, string developerSerialNumber, int waitingEngineTimeout) { projectId = developerSerialNumber; engineHolders = new EngineHolder [enginesCount]; for (var i = 0; i < enginesCount; i++) { engineHolders[i] = new EngineHolder(projectId); } engineHolderLock = new object(); waitingTimeout = waitingEngineTimeout; semaphore = new Semaphore(enginesCount, enginesCount); usageCountLock = new object(); autoRecycleUsageCount = 0; // Zero means that auto recycling will not be performed }
private void RecycleEngine(int engineIndex) { Log.Information("Recycling Abbyy engine with id {engineIndex}", engineIndex); try { engineHolders[engineIndex].Dispose(); } catch (Exception ex) { Log.Error(ex, "While recycling Abbyy engine, received an error while disposing of engine."); } finally { engineHolders[engineIndex] = new EngineHolder(projectId); } }
private void ReleaseEngine(int engineIndex, bool isRecycleRequired) { lock (engineHolderLock) { var isAutoRecycleRequired = AutoRecycleUsageCount != 0 && AutoRecycleUsageCount <= engineHolders[engineIndex].GetEngineUsageCount(); Log.Information("Releasing Abbyy engine with id {engineIndex}", engineIndex); engineHolders[engineIndex].UnlockEngine(); if (isRecycleRequired || isAutoRecycleRequired) { Log.Information("Recycling Abbyy engine with id {engineIndex}", engineIndex); engineHolders[engineIndex].Dispose(); engineHolders[engineIndex] = new EngineHolder(projectId); } } }