J'ai une page "refreshPhoto.aspx" qui fait un gros calcul. Je ne veux
pas qu'on puisse lancer plus d'un calcul en meme temps. Donc, j'ai
déclaré comme membre de ma classe un objet verrou:
Public Shared VERROU As String = "verrou"
et dans ma méthode qui fait le gros calcul, je commence tout de suite
par ça:
If (Threading.Monitor.TryEnter(VERROU)) = False Then
Return "plus tard"
End If
donc, si un calcul est déjà en cours, ç'est sensé refuser d'en faire un
autre. bien sur, à la fin du gros calcul je lache le verrou
Threading.Monitor.Exit(VERROU)
j'ai aussi ajouté une méthode pour tester le verrou
Public Shared Function testVerrou() As String
If (Threading.Monitor.TryEnter(VERROU)) = False Then
Return "Verrou était occupé"
Else
Threading.Monitor.Exit(VERROU)
Return "Verrou était libre"
End If
End Function
Mais, mon souci est le suivant. Mon appli Asp.Net tourne bien évidemment
avec un IIS6. Cette appli fait partie d'une seule ApplicationPool dediée
à son exécution, et que j'ai configurée pour avoir 5 worker process.
Donc, je lance une page qui fait le gros calcul, puis je lance une page
qui teste le verrou: et devinez ce que ça me dit: "le verrou était libre"
Comment que ça se fait ? est-ce que ça vient du fait qu'il y a plusieurs
worker process ? est-ce qu'ils ne partagent quand même pas les membres
"shared" des classes ?
si quelqu'un peut m'aider à verrouiller ce calcul sans verrouiller
l'execution d'autres pages, je lui en serais reconnaissant
si quelqu'un peut m'aider à verrouiller ce calcul sans verrouiller l'execution d'autres pages, je lui en serais reconnaissant
Essayez d'utiliser Application.Lock() et Application.Unlock() autour de votre code effectuant le calcul.
-- Zazar
Etienne REMOND
Non, ça change rien. Je dois juste bloquer cette page; les autres pages de mon appli doivent continuer d'être consultables, mais cette page qui lance un calcul ne doit pas en lancer un autre si il y en a déjà un qui tourne. c'est un calcul qui appel des procédures stockées sql-server. peut-être y-a-t'il un moyen de mettre un verrou proprement dans une table sql en utilisant des transactions ?
Etienne
Zazar wrote:
Bonjour,
si quelqu'un peut m'aider à verrouiller ce calcul sans verrouiller l'execution d'autres pages, je lui en serais reconnaissant
Essayez d'utiliser Application.Lock() et Application.Unlock() autour de votre code effectuant le calcul.
-- Zazar
Non, ça change rien. Je dois juste bloquer cette page; les autres pages
de mon appli doivent continuer d'être consultables, mais cette page qui
lance un calcul ne doit pas en lancer un autre si il y en a déjà un qui
tourne. c'est un calcul qui appel des procédures stockées sql-server.
peut-être y-a-t'il un moyen de mettre un verrou proprement dans une
table sql en utilisant des transactions ?
Etienne
Zazar wrote:
Bonjour,
si quelqu'un peut m'aider à verrouiller ce calcul sans verrouiller
l'execution d'autres pages, je lui en serais reconnaissant
Essayez d'utiliser Application.Lock() et Application.Unlock() autour de
votre code effectuant le calcul.
Non, ça change rien. Je dois juste bloquer cette page; les autres pages de mon appli doivent continuer d'être consultables, mais cette page qui lance un calcul ne doit pas en lancer un autre si il y en a déjà un qui tourne. c'est un calcul qui appel des procédures stockées sql-server. peut-être y-a-t'il un moyen de mettre un verrou proprement dans une table sql en utilisant des transactions ?
Etienne
Zazar wrote:
Bonjour,
si quelqu'un peut m'aider à verrouiller ce calcul sans verrouiller l'execution d'autres pages, je lui en serais reconnaissant
Essayez d'utiliser Application.Lock() et Application.Unlock() autour de votre code effectuant le calcul.
-- Zazar
Zazar
> Non, ça change rien.
Je ne connais pas IIS6 et donc je ne connais pas le mode de fonctionnement dont vous parlez. IIS6 crée t-il plusieurs instances de votre application ? S'il ne crée qu'une seule instance, alors ça devrait fonctionner. Sinon il va falloir mettre le verrou à l'extérieur de votre application (un Mutex par exemple ou bien à l'aide des transactions SQL comme vous le proposiez).
Je dois juste bloquer cette page; les autres pages de mon appli doivent continuer d'être consultables,
Application.Lock() ne bloque pas toute l'application, il bloque juste les pages qui font un appel à Application.Lock() tant que la page ayant mis le verrou n'appelle pas Application.Unlock().
-- Zazar
> Non, ça change rien.
Je ne connais pas IIS6 et donc je ne connais pas le mode de fonctionnement
dont vous parlez. IIS6 crée t-il plusieurs instances de votre application ?
S'il ne crée qu'une seule instance, alors ça devrait fonctionner. Sinon il
va falloir mettre le verrou à l'extérieur de votre application (un Mutex par
exemple ou bien à l'aide des transactions SQL comme vous le proposiez).
Je dois juste bloquer cette page; les autres pages
de mon appli doivent continuer d'être consultables,
Application.Lock() ne bloque pas toute l'application, il bloque juste les
pages qui font un appel à Application.Lock() tant que la page ayant mis le
verrou n'appelle pas Application.Unlock().
Je ne connais pas IIS6 et donc je ne connais pas le mode de fonctionnement dont vous parlez. IIS6 crée t-il plusieurs instances de votre application ? S'il ne crée qu'une seule instance, alors ça devrait fonctionner. Sinon il va falloir mettre le verrou à l'extérieur de votre application (un Mutex par exemple ou bien à l'aide des transactions SQL comme vous le proposiez).
Je dois juste bloquer cette page; les autres pages de mon appli doivent continuer d'être consultables,
Application.Lock() ne bloque pas toute l'application, il bloque juste les pages qui font un appel à Application.Lock() tant que la page ayant mis le verrou n'appelle pas Application.Unlock().
-- Zazar
Etienne REMOND
merci Zazar pour tes conseils.
j' ai essayé d'utiliser un Mutex mais c'est pas évident. je me suis mélangé les pinceaux entre - dim monMutex as Threading.Mutex = new Threading.Mutex (true,"monMutex",newCreated) - monMutex.waitOne() - monMutex.ReleaseMutex()
finalement j'ai utilisé que new Mutex et releasedMutex mais ça marche pas: je lance un gros calcul. il se termine. j'essaye d'en lancer un deuxième et ça me dit: mutex est utilisé alors que le premier calcul est fini et a fait un releaseMutex.
donc j'ai abandonné le mutex pour me tourner vers un bon vieux verrou fichier. j'ai utilisé new FileStream("...",Append,Write,None) et ça marche très bien.
comme quoi les bons vieux verrous marchent toujours ...
:-)
merci pour tous les conseils
Etienne
Zazar wrote:
Non, ça change rien.
Je ne connais pas IIS6 et donc je ne connais pas le mode de fonctionnement dont vous parlez. IIS6 crée t-il plusieurs instances de votre application ? S'il ne crée qu'une seule instance, alors ça devrait fonctionner. Sinon il va falloir mettre le verrou à l'extérieur de votre application (un Mutex par exemple ou bien à l'aide des transactions SQL comme vous le proposiez).
Je dois juste bloquer cette page; les autres pages de mon appli doivent continuer d'être consultables,
Application.Lock() ne bloque pas toute l'application, il bloque juste les pages qui font un appel à Application.Lock() tant que la page ayant mis le verrou n'appelle pas Application.Unlock().
-- Zazar
merci Zazar pour tes conseils.
j' ai essayé d'utiliser un Mutex mais c'est pas évident.
je me suis mélangé les pinceaux entre
- dim monMutex as Threading.Mutex = new Threading.Mutex
(true,"monMutex",newCreated)
- monMutex.waitOne()
- monMutex.ReleaseMutex()
finalement j'ai utilisé que new Mutex et releasedMutex mais ça marche
pas: je lance un gros calcul. il se termine. j'essaye d'en lancer un
deuxième et ça me dit: mutex est utilisé alors que le premier calcul est
fini et a fait un releaseMutex.
donc j'ai abandonné le mutex pour me tourner vers un bon vieux verrou
fichier. j'ai utilisé new FileStream("...",Append,Write,None) et ça
marche très bien.
comme quoi les bons vieux verrous marchent toujours ...
:-)
merci pour tous les conseils
Etienne
Zazar wrote:
Non, ça change rien.
Je ne connais pas IIS6 et donc je ne connais pas le mode de fonctionnement
dont vous parlez. IIS6 crée t-il plusieurs instances de votre application ?
S'il ne crée qu'une seule instance, alors ça devrait fonctionner. Sinon il
va falloir mettre le verrou à l'extérieur de votre application (un Mutex par
exemple ou bien à l'aide des transactions SQL comme vous le proposiez).
Je dois juste bloquer cette page; les autres pages
de mon appli doivent continuer d'être consultables,
Application.Lock() ne bloque pas toute l'application, il bloque juste les
pages qui font un appel à Application.Lock() tant que la page ayant mis le
verrou n'appelle pas Application.Unlock().
j' ai essayé d'utiliser un Mutex mais c'est pas évident. je me suis mélangé les pinceaux entre - dim monMutex as Threading.Mutex = new Threading.Mutex (true,"monMutex",newCreated) - monMutex.waitOne() - monMutex.ReleaseMutex()
finalement j'ai utilisé que new Mutex et releasedMutex mais ça marche pas: je lance un gros calcul. il se termine. j'essaye d'en lancer un deuxième et ça me dit: mutex est utilisé alors que le premier calcul est fini et a fait un releaseMutex.
donc j'ai abandonné le mutex pour me tourner vers un bon vieux verrou fichier. j'ai utilisé new FileStream("...",Append,Write,None) et ça marche très bien.
comme quoi les bons vieux verrous marchent toujours ...
:-)
merci pour tous les conseils
Etienne
Zazar wrote:
Non, ça change rien.
Je ne connais pas IIS6 et donc je ne connais pas le mode de fonctionnement dont vous parlez. IIS6 crée t-il plusieurs instances de votre application ? S'il ne crée qu'une seule instance, alors ça devrait fonctionner. Sinon il va falloir mettre le verrou à l'extérieur de votre application (un Mutex par exemple ou bien à l'aide des transactions SQL comme vous le proposiez).
Je dois juste bloquer cette page; les autres pages de mon appli doivent continuer d'être consultables,
Application.Lock() ne bloque pas toute l'application, il bloque juste les pages qui font un appel à Application.Lock() tant que la page ayant mis le verrou n'appelle pas Application.Unlock().
-- Zazar
Zazar
Bonjour,
j' ai essayé d'utiliser un Mutex mais c'est pas évident. je me suis mélangé les pinceaux entre - dim monMutex as Threading.Mutex = new Threading.Mutex (true,"monMutex",newCreated) - monMutex.waitOne() - monMutex.ReleaseMutex()
finalement j'ai utilisé que new Mutex et releasedMutex mais ça marche pas: je lance un gros calcul. il se termine. j'essaye d'en lancer un deuxième et ça me dit: mutex est utilisé alors que le premier calcul est fini et a fait un releaseMutex.
Il faut utiliser le constructeur prenant un bool et un string en paramètre, vous passez false en 1er argument et une chapine constante en second argument. Ensuite avant le calcul, il faut faire un WaitOne() et à la fin un ReleaseMutex(). Si vous faîtes plusieurs WaitOne(), il faut faire plusieur ReleaseMutex(), si vous mettez true en 1er argument (c'est déconseillé), et que vous obtenez le mutex, il faut faire un ReleaseMutext() supplémentaire.
donc j'ai abandonné le mutex pour me tourner vers un bon vieux verrou fichier. j'ai utilisé new FileStream("...",Append,Write,None) et ça marche très bien.
comme quoi les bons vieux verrous marchent toujours ...
:)
-- Zazar
Bonjour,
j' ai essayé d'utiliser un Mutex mais c'est pas évident.
je me suis mélangé les pinceaux entre
- dim monMutex as Threading.Mutex = new Threading.Mutex
(true,"monMutex",newCreated)
- monMutex.waitOne()
- monMutex.ReleaseMutex()
finalement j'ai utilisé que new Mutex et releasedMutex mais ça marche
pas: je lance un gros calcul. il se termine. j'essaye d'en lancer un
deuxième et ça me dit: mutex est utilisé alors que le premier calcul est
fini et a fait un releaseMutex.
Il faut utiliser le constructeur prenant un bool et un string en paramètre,
vous passez false en 1er argument et une chapine constante en second
argument.
Ensuite avant le calcul, il faut faire un WaitOne() et à la fin un
ReleaseMutex().
Si vous faîtes plusieurs WaitOne(), il faut faire plusieur ReleaseMutex(),
si vous mettez true en 1er argument (c'est déconseillé), et que vous
obtenez le mutex, il faut faire un ReleaseMutext() supplémentaire.
donc j'ai abandonné le mutex pour me tourner vers un bon vieux verrou
fichier. j'ai utilisé new FileStream("...",Append,Write,None) et ça
marche très bien.
comme quoi les bons vieux verrous marchent toujours ...
j' ai essayé d'utiliser un Mutex mais c'est pas évident. je me suis mélangé les pinceaux entre - dim monMutex as Threading.Mutex = new Threading.Mutex (true,"monMutex",newCreated) - monMutex.waitOne() - monMutex.ReleaseMutex()
finalement j'ai utilisé que new Mutex et releasedMutex mais ça marche pas: je lance un gros calcul. il se termine. j'essaye d'en lancer un deuxième et ça me dit: mutex est utilisé alors que le premier calcul est fini et a fait un releaseMutex.
Il faut utiliser le constructeur prenant un bool et un string en paramètre, vous passez false en 1er argument et une chapine constante en second argument. Ensuite avant le calcul, il faut faire un WaitOne() et à la fin un ReleaseMutex(). Si vous faîtes plusieurs WaitOne(), il faut faire plusieur ReleaseMutex(), si vous mettez true en 1er argument (c'est déconseillé), et que vous obtenez le mutex, il faut faire un ReleaseMutext() supplémentaire.
donc j'ai abandonné le mutex pour me tourner vers un bon vieux verrou fichier. j'ai utilisé new FileStream("...",Append,Write,None) et ça marche très bien.
comme quoi les bons vieux verrous marchent toujours ...