私はサードパーティのフィードからデータを読み込み、少し修正して保存してから、クライアントに返すためにWebサービスに取り組んでいます。定期的に第三者サイトからの更新が必要です。 AzureのWebロールでWCFサービスとして実行されます。まずCでWebサービスキャッシュを構築する方法#
は、私はちょうどいつも私parsefeedメソッドへの呼び出しを行いますが、最後の更新が早すぎた場合はそのコールのリターンを作るだろうと思った...
public void ParseFeed()
{
if (DateTime.Now > lastrun.AddMinutes(1))
{
//Fetch updated data into something shared here.
//thedata is a public static in Global class
thedata = fetchdata();
lastrun=DateTime.Now;
}
}
しかし、私は推測フェッチとしてできること一度に複数のユーザーがそのコードにヒットする1-2秒(そのWebサービス)を利用します。 http://support.microsoft.com/default.aspx?scid=kb;en-us;Q312607 から
アプリケーションクラスを含む任意のクラスの静的メンバは、スレッドセーフではないので、ユーザコードは、静的メンバにアクセスするための適切なロックを提供しなければなりません。これは、アプリケーションクラスに追加する静的メンバーに適用されます。情報の多くはhere
私は静的VARを回避し、キャッシュを使用し、その中に自分のデータを入れることができます(それは希望:
私は(わからない方法)ロックEDITを使用することができます有効期限が切れると複数のユーザーがデータを取得しようとします)
偽のデータ項目を持つキャッシュ(基本的にはタイマー)を使用して有効期限が切れると更新できますが、サイトに当たっていた。
出力キャッシュを使用することは実際にはできません。クライアントは、各リクエストを一意にする方法でクライアントに返すデータを照会するからです。要求に応じてサービスの並べ替えとフィルタリングを行います。
私は、Azureの複数のインスタンスで結果の一貫性について心配していません。それぞれは自分自身を取得することができるので、複数のサーバーに状態を共有する必要はありません。
シンプルな解決策があると感じました。私は完全に逃しました。アイデア?
ロックを管理する方法を示したhttp://stackoverflow.com/questions/39112/what-is-the-best-way-to-lock-cache-in-asp-net#40065を見つけました。これはほとんどのオプションに当てはまることがありますが、キャッシュや静的な変数を使用するかどうか、あるいはより簡単なメカニズムがあるかどうかという疑問が残っています – Andiih