2010-12-14 4 views
0

これはWCFに関する質問ですが、おそらくAzureにも関係していると思います。私は鉄のpythonスクリプトを実行する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

最も単純な解決策は、単にプロパティを静的とマークすることです。私は、このコードが並行して呼び出せる可能性があると推測します。そのため、辞書に追加することがスレッドセーフであることを確認する必要があります。以下にコードスニペットを示します。私は

[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

ありがとうござい以下AddToCache機能のようなものを呼び出してScriptCache.Addへの呼び出しを置き換えると思います!それは完璧に働いた。まるでクラス全体が各呼び出しをインスタンス化しているかのように動作しました。私は(そうであれば)静的オブジェクトでさえも再現されていると考えました。 +1 ...助けてくれてありがとう! – Brosto