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