Je travaille sur un service Web pour lire les données d'un flux tiers, le modifier un peu et le stocker, puis le renvoyer à mes clients. Il suffit de mettre à jour à partir du site tiers régulièrement. Il sera exécuté en tant que service WCF dans un rôle Web dans Azure.Comment construire un cache de service Web en C#
Au début, je pensais que je voudrais juste toujours faire appel à ma méthode parsefeed, mais assurez-vous que le retour d'appel si la dernière mise à jour était trop tôt ...
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;
}
}
Mais je suppose que la récupération peut prendre 1-2s (c'est un service web) que plusieurs utilisateurs vont frapper ce code à la fois.
de http://support.microsoft.com/default.aspx?scid=kb;en-us;Q312607 Parce que les membres statiques de toute classe, y compris une classe d'application, ne sont pas thread-safe, le code utilisateur doit fournir le verrouillage approprié pour accéder aux membres statiques. Cela s'applique à tout membre statique que vous ajoutez à la classe d'application.
je pouvais utiliser le verrouillage (pas sûr) EDIT: beaucoup d'informations here
je pouvais éviter le var statique et utiliser un cache, et de mettre mes données (mais qui être supprimé à l'expiration et plusieurs utilisateurs essaieraient d'extraire les données)
Je pourrais utiliser un cache avec un faux élément de données dedans (fondamentalement comme une minuterie) et rafraichir quand ça expirait - mais ça rafraîchirait même si personne ne frappait le site. (Je ne peux pas non plus être thread-safe)
Je ne peux pas vraiment utiliser un cache de sortie parce que les clients interrogent les données que je retourne d'une manière qui rend chaque requête unique: mon service trie et filtre selon la demande
BTW Je ne suis pas préoccupé par la cohérence des résultats sur plusieurs instances sur Azure. Chacun peut aller chercher le sien, donc je n'ai pas besoin de partager l'état sur plusieurs serveurs.
J'ai l'impression qu'il existe une solution simple, que j'ai totalement manquée. Des idées?
J'ai repéré ce http://stackoverflow.com/questions/39112/what-is-the-best-way-to-lock-cache-in-asp-net#40065 qui montre comment gérer les verrous. Cela pourrait s'appliquer à la plupart des options, et laisse toujours la question de savoir si utiliser le cache, les vars statiques ou s'il y a un mécanisme plus simple. – Andiih