2011-02-07 1 views
0

Existe-t-il un moyen dans asp.net de s'assurer qu'un certain sous-thread n'est pas exécuté deux fois simultanément, quoi qu'il arrive?asp.net global synclock object

le code que j'ai maintenant

Public Class CheckClass 
ReadOnly Property CheckSessionsLock As Object 
    Get 
     If HttpRuntime.Cache("CheckSessionsLock") Is Nothing Then HttpRuntime.Cache("CheckSessionsLock") = New Object 
     Return HttpRuntime.Cache("CheckSessionsLock") 
    End Get 
End Property 
Sub TryThreads() 
    Dim thread = New Thread(AddressOf TryLock) 
    thread.Priority = ThreadPriority.Lowest 
    thread.Start() 
End Sub 
Sub TryLock() 
    SyncLock CheckSessionsLock 
     DoTrace("entered locker") 
     For x = 0 To 10000 
     Next 
     DoTrace("exiting locker") 
    End SyncLock 
    DoTrace("exited locker") 
End Sub 
End Class 

si je lance ce code sur chaque page puis à plusieurs reprises le code chevauche. la fonction DoTrace dans le code écrit simplement le message dans une table.

les messages de la table devraient apparaître dans l'ordre (entré, sortant, quitté) encore et encore, mais en réalité, ils ne le font pas. Je suis comme entré, sortant, entré, sorti, sortant ...

cela signifie que la synchronisation n'est pas terminée. Est-ce vrai? Si oui, comment peut-on implémenter une synclock complète sur un bloc de code, entre requêtes et entre sessions?

EDIT: J'ai besoin de ce verrou, car le code réel enverra des emails, selon une liste de types de mailing dans un db. après chaque type de mailing est envoyé, son marqué, puis il continue avec le mailing suivant. Je ne peux pas avoir au milieu du traitement, un autre thread devrait voir ce mailing comme non traité.

s'il vous plaît conseiller

Répondre

2

Plutôt que d'utiliser le cache HttpRuntime avez-vous envisagé d'utiliser une variable statique? Juste comme une note (il pourrait être utile d'expliquer pourquoi vous voulez cette fonctionnalité) votre site Web ne sera pas très évolutif si cela ne peut être exécuté qu'une fois à la fois.

+0

salut merci. oui j'essayé. S'il vous plaît voir http: // stackoverflow.com/questions/4851591/asp-net-multithreading-avec-synclock. aussi ive édité ma question pour inclure le raisonnement. Merci. –

+0

Les variables statiques sont partagées sur l'ensemble de l'AppDomain, ce qui est identique à l'ensemble de l'application. –

+1

Je m'attendrais à ce que votre code imprime Entrée et sortie l'un après l'autre, mais en raison de la façon dont le SyncLock fonctionne, il y a une chance qu'il imprime le suivant Entré avant la sortie finale –

1

En C# (désolé, je ne sais pas la syntaxe VB) J'utilise ceci:

private static readonly object Padlock = new object(); 
  • Il est un champ, pas une propriété,
  • Il est statique (en VB, qui est "partagé" si je ne me trompe pas) il en est de même dans toute l'application
  • Il est initialisé une fois que vous utilisez cette classe, et non lorsque vous utilisez explicitement le champ.

Avec votre propriété/version cache, vous pourriez avoir deux fils en essayant d'obtenir le verrou-objet et chaque création d'un autre:

  • contrôles Discussion 1 le cache et ne trouve pas l'objet
  • discussion 1 est stationnée
  • discussion 2 vérifie le cache, ne trouve pas l'objet
  • discussion 2 crée l'objet et met en cache, récupère à nouveau et revient de la propriété
  • Discussion 1 reprend
  • Discussion 1 crée un nouvel objet et il met en cache, récupère à nouveau et retourne un objet de verrouillage différent que les fils 2 utilise
  • Toute autre fils utilisera l'objet de verrouillage de fil 1
Questions connexes