2014-06-18 4 views
4

J'ai une application web pour retourner des images à mon interface. Dans cette application ce qui se passe est: quand une demande est faite à une image particulière l'application vérifie si l'image existe déjà sur le disque, si elle existe renvoie l'image. Mon problème commence quand l'image n'existe pas sur le disque. Lorsque deux demandes sont faites en même temps pour la même image et qu'il n'existe pas sur le disque, j'ai un problème parce que les deux threads essaient de créer le même fichier sur le disque en même temps. Pour résoudre le problème, pour commencer ce que j'ai essayé de faire était de créer un Mutex dans la création de l'image disque. Mais il y avait un problème. Comme la charge du serveur est énorme en raison du grand nombre de requêtes simultanées, le serveur plante.Meilleure façon (meilleure performance) de verrouiller la création de fichiers

Je voudrais demander quelles sont vos idées pour résoudre ce problème. Ou si vous voulez faire autrement?

Merci.

+0

Peut-être que ce lien pourrait contient des informations utiles http://social.msdn.microsoft.com/Forums/vstudio/en-US/a5300fc5-126c-4e33-8ae6-13376031e9fe/how-to-lock-or -unlock-a-file-using-c? forum = csharpgeneral –

Répondre

2

Vous pouvez essayer le modèle suivant:

  1. Essayez de lire l'image (si réussit, qu'à faire)
  2. Essayez de créer l'image avec un verrou en écriture
  3. uniquement sur « Fichier exception utilisation », petit retard (millisecondes)
  4. Retour à l'étape 1 (nouvelle tentative)

Faites le retard vraiment petit, juste un tout petit peu plus grand que th e temps, il devrait créer une image. Implémentez une limite de réessai, maximum 3 fois.

Cela vous permettra d'utiliser le mécanisme de verrouillage

+0

Cela semble être une bonne idée! Je vais essayer ça. Merci –

-1

déjà existant (fichier) Vous pouvez appeler la fonction open avec O_CREAT et O_EXCL drapeaux. L'appel ouvert du premier processus obtiendra un accès exclusif pour créer le fichier et il commencera à télécharger l'image. L'appel ouvert du processus suivant échouera car leur ouverture n'est pas exclusive et "errno" sera défini sur EEXIST. Selon votre conception, les processus suivants peuvent soit attendre la création complète du fichier, soit revenir en arrière.

fd = open(path, O_CREAT|O_EXCL) 
+0

Désolé mais j'utilise ASP.NET –

+0

Puis-je connaître la raison du vote négatif? –

+0

Oui! Parce que j'ai tagué ma question avec C# et non C. –

Questions connexes