예제 #1
0
 public override object Execute(IContextProvider provider, object[] args, MemoryPool pool)
 {
     object[] keys = new object[m_params.Count + 1];
     keys[0] = provider.Context;
     for (int k = 0; k < m_params.Count; k++)
         keys[k + 1] = pool.GetData(m_params[k]);
     Key key = new Key(QueryContext.Engine, keys);
     object res;
     lock (m_cache)
     {
         if (m_cache.TryGetValue(key, out res))
             return res.CloneObject();
     }
     res = m_body.Execute(provider, args, pool);
     lock (m_cache)
     {
         if (!m_cache.ContainsKey(key))
         {
             key.CloneKeys();
             m_cache.Add(key, res);
         }
     }
     return res.CloneObject();
 }