2010-12-14 3 views
0

Я считаю, что это вопрос WCF, но, возможно, это также связано с Azure. У меня есть проект WCF, который выполняет некоторые скрипты из железа python. Я хотел бы сохранить кэш скомпилированных скриптов, поэтому им не нужно будет перекомпилировать каждый раз.Создать глобальный объект в проекте Azure WCF

Когда эти сценарии запускаются в первый раз, они могут иногда занимать 2 или 3 секунды. Однако в следующий раз, когда они запустится, они будут выполняться всего за несколько миллисекунд. Я хотел бы кэшировать исходный код сценария, поэтому он только один раз компилируется, а затем повторно используется для всех, кто использует мой сервис. В настоящее время все мое поведение службы создается каждый раз, когда кто-то подключается к моей службе. Есть ли способ, чтобы объект ScriptCache был устойчивым для жизни приложения?

Ниже приведен пример кода, с которым я играю.

[ServiceBehavior] 
public class Foo: IFoo { 
    ScriptEngine engine = Python.CreateEngine(); 
    Dictionary<string, ScriptHost> ScriptCache = new Dictionary<string, ScriptHost>(); 
    public fooBar doSomething() { 
     ... 
     for (int editIndex = 0; editIndex < Edits.Count; editIndex++) { 
      ScriptHost mCurrentScript; 
      if (!ScriptCache.TryGetValue(Edits[editIndex], out mCurrentScript)) { 
       mCurrentScript = new ScriptHost(LoadScriptFromStorage(Edits[editIndex]), Edits[editIndex], engine); 
       ScriptCache.Add(Edits[editIndex], mCurrentScript); 
      } 
      mEditTimer.Start(); 
      mCurrentScript.runScript(mCurrentObj); 
      mEditTimer.Stop(); 
      WriteToLog(mJobID, "Edit: {0}\tTime: {1}", Edits[editIndex], mEditTimer.Elapsed.TotalMilliseconds); 
      mEditTimer.Reset(); 
      mEditTimer.Start(); 
      mCurrentScript.runScript(mCurrentObj); 
      mEditTimer.Stop(); 
      WriteToLog(mJobID, "Edit: {0}\tTime: {1}\t2nd run", Edits[editIndex], mEditTimer.Elapsed.TotalMilliseconds); 
      mEditTimer.Reset(); 
      } 
    } 

ответ

1

Простейшим решением является просто отметить свойства как статические. Я собираюсь предположить, что возможно, что этот код может быть вызван параллельно, поэтому вам нужно убедиться, что добавление в словарь является потокобезопасным. Ниже приведен фрагмент кода. Я бы заменить вызов ScriptCache.Add с вызовом что-то вроде функции AddToCache ниже

[ServiceBehavior] 
public class Foo : IFoo 
{ 
    static ScriptEngine engine = Python.CreateEngine(); 
    static Dictionary<string, ScriptHost> ScriptCache = new Dictionary<string, ScriptHost>(); 
    static object _dictionaryLock = new object(); 

    static void AddToCache(string edit, ScriptHost host) 
    { 
     lock (_dictionaryLock) 
     { 
      if (!ScriptCache.ContainsKey(edit)) 
      { 
       ScriptCache.Add(edit, host); 
      } 
     } 
    } 

    ... 
} 
+0

Спасибо! Это сработало отлично. Он действовал так, как будто весь класс создавался каждый вызов. Я решил (если это так), даже статические объекты были бы воссозданы. +1 ... спасибо за помощь! – Brosto

Смежные вопросы