2010-12-14 27 views
0

J'utilise jQuery pour appeler PageMethods. Pour certaines opérations, les informations d'identification de l'utilisateur actuel doivent être validées et pour d'autres opérations, j'ai besoin d'appeler d'autres méthodes statiques. Voici quelques exemples de code:Est-ce que la création d'instances d'une classe dans un thread statique PageMethod est sûre?

Exemple # 1

[WebMethod] 
public static void PostComment(string comment) 
{ 
    UserAuth auth = new UserAuth(); 
    if (auth.isAuthenticated) 
     { 
      //Post comment here... 
     } 
} 

Exemple # 2

[WebMethod] 
public static string GetComment(int commentId) 
{ 

    commentDto comment = //get comment data from the database... 
    string friendlyDate = ConvertFriendlyDate(comment.commentDate); 

    return friendlyDate + " " + comment.text; 
} 

public static string ConvertFriendlyDate(DateTime commentDate) 
{ 
    string friendlyDate = //call static utility method to convert date to friendly format 

    return friendlyDate; 

} 

Vais-je être sûr d'utiliser ces types d'opérations? Est-il préférable de supprimer les méthodes de page et d'appeler une page ASPX séparée pour mes demandes AJAX?

+0

Que se passe-t-il si j'appelle une méthode statique commune à partir de chaque méthode de page qui en a besoin pour traiter la connexion utilisateur? – jpshook

Répondre

0

Les exemples que vous avez donnés sont corrects. Si vous réutilisiez une instance d'un objet, je ferais en sorte que cet objet soit sûr pour les threads.

+0

Merci pour les commentaires! – jpshook

0

Tant que vous ne touchez aucune ressource partagée, il doit être sécurisé.

+0

J'ai lu les informations du livre de texte, à la recherche d'un peu plus de perspicacité. – jpshook

1

De http://msdn.microsoft.com/en-us/library/system.web.ui.page.aspx

"Tous les membres static (Shared dans Visual Basic) de ce type [Page] sont thread-safe. Tous les membres d'instance ne sont pas garantis d'être thread-safe."

Par conséquent, tant que vos méthodes statiques ne touchent pas les objets de portée de classe, cela devrait fonctionner. par exemple. cela pourrait être mauvais:

static UserAuth auth; 
[WebMethod] 
public static void PostComment(string comment) 
{ 
    auth = new UserAuth(); 
    if (auth.isAuthenticated) 
     { 
      //Post comment here... 
     } 
} 
+0

Gotcha .. tant que tout est autonome, alors je devrais être ok. – jpshook

0

voir si votre classe est immuable que Menas personne ne peut changer son état si elle est modifiée, il sera nouvelle instance que vous aurez pas besoin de vous soucier des problèmes de filetage, mais si vous êtes changer un état partagé que vous ne devriez penser à la synchronisation mais je ne pense pas que vous ayez besoin d'une synchronisation de thread dans votre cas.

+0

Je pense que les méthodes de page doivent être comme ça, mais je peux me tromper – jpshook