コード例 #1
0
        public IPooledEngine CheckoutEngine()
        {
            PooledEngine pooledEngine = null;

            lock (_poolMutex)
            {
                if (_enginesCheckedOut < _scriptEngineSettings.MaxEnginesInPool)
                {
                    if (Engines.Count > 0)
                    {
                        pooledEngine = Engines.TakeFirst();
                    }
                    else
                    {
                        pooledEngine = CreateNewEngine();
                    }
                }
            }
            if (pooledEngine == null)
            {
                Monitor.Wait(_checkoutMutex);
                pooledEngine = CheckoutEngine() as PooledEngine;
            }
            else
            {
                pooledEngine.UseCount++;
                _enginesCheckedOut++;
                pooledEngine.CheckedIn = true;
            }
            return(pooledEngine);
        }
コード例 #2
0
 public void CheckinEngine(IPooledEngine pooledEngine)
 {
     lock (_poolMutex)
     {
         PooledEngine unwrappedPooledEngine = (PooledEngine)pooledEngine;
         if (unwrappedPooledEngine != null && !unwrappedPooledEngine.CheckedIn)
         {
             unwrappedPooledEngine.Expired |= unwrappedPooledEngine.UseCount == _scriptEngineSettings.PoolEngineExpirationUseCount;
             if (unwrappedPooledEngine.Expired)
             {
                 DestroyEngine(unwrappedPooledEngine);
             }
             else
             {
                 Engines.AddLast(unwrappedPooledEngine);
             }
             _enginesCheckedOut--;
             unwrappedPooledEngine.CheckedIn = true;
             Monitor.Pulse(_checkoutMutex);
         }
     }
 }
コード例 #3
0
        private PooledEngine CreateNewEngine()
        {
            PooledEngine pooledEngine = new PooledEngine()
            {
                ScriptEngine = new MsieJsEngineAdapter(new MsieJsEngine()),
                PoolId       = _enginesCheckedOut
            };

            pooledEngine.ExpirationTimer = new Timer((state) =>
            {
                lock (_poolMutex)
                {
                    if (!pooledEngine.Expired && pooledEngine.CheckedIn)
                    {
                        Engines.Remove(pooledEngine);
                        DestroyEngine(pooledEngine);
                    }
                    pooledEngine.Expired         = true;
                    pooledEngine.ExpirationTimer = null;
                }
            }, null, _scriptEngineSettings.PoolEngineExpirationInMinutes, Timeout.Infinite);

            return(pooledEngine);
        }
コード例 #4
0
 private void DestroyEngine(PooledEngine pooledEngine)
 {
     pooledEngine.ScriptEngine.Dispose();
     pooledEngine.ExpirationTimer?.Dispose();
     pooledEngine.ExpirationTimer = null;
 }