Создать глобальный объект в проекте Azure WCF - PullRequest
0 голосов
/ 14 декабря 2010

Я считаю, что это вопрос WCF, но, возможно, он также связан с 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 Ответ

1 голос
/ 14 декабря 2010

Самое простое решение - просто пометить свойства как статические. Я предполагаю, что вполне возможно, что этот код может вызываться параллельно, поэтому вам нужно убедиться, что добавление в словарь является потокобезопасным. Я включил фрагмент кода ниже. Я бы заменил вызов 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);
            }
        }
    }

    ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...