Question

J'ai un simple service Web asmx qui n'a besoin que de consigner certaines informations dans une base de données transactionnelle. Cependant, le temps est écoulé pour le client. L'appel à mettre à jour la base de données appelle juste une procédure stockée et je ne crois pas qu'elle pourrait être optimisée davantage pour de meilleures performances. J'ai été réduit à simplement consigner l'exécution à l'aide de log4net, puis à lire le journal par un processus distinct qui met à jour la base de données.

Je me demandais s'il y avait une meilleure façon de faire cela. Je me demandais s'il y avait un moyen de faire que mon code fasse quelque chose comme:

public bool method(...)
{
  LogRun(...)

  Asynchronously call method to insert transaction

  return true;  
}
Était-ce utile?

La solution

MODIFIER: je me suis trompé à propos de BackgroundWorker. Je l’ai donc fait passer à la version Thread, testée.

Si vous souhaitez que le travail soit effectué de manière asynchrone, vous pouvez étudier le démarrage d'un autre thread.

public class Service1 : System.Web.Services.WebService
{

    [WebMethod]
    public void Log(int foo, int bar)
    {
        Thread a = new Thread(new ThreadStart(delegate()
        {
            // Do some processing here
            // For example, let it sleep for 10 secs
            Thread.Sleep(10000);
        }));
        a.Start();
    }
}

Il faut 10 secondes à la méthode Log pour terminer le traitement si la ligne Thread.Sleep (10000) figure dans la méthode Log elle-même. Cependant, avec Fil de discussion a , la méthode Journal sera renvoyée immédiatement après l'appel.

Notez également qu'il n'existe pas de moyen simple de garantir le client appelant si l'opération d'insertion est terminée ou non, avec ce style d'appel asynchrone.

Autres conseils

Vous pouvez essayer le suivi .

Si la requête ne peut plus être optimisée, vous pouvez augmenter le nombre valeur de délai d'attente pour votre client SQL , en supposant que vous utilisiez peut-être un serveur SQL.

Du côté du client qui utilise le service Web, vous pouvez utiliser cette méthode de manière asynchrone si vous souhaitez que le client continue à effectuer d'autres opérations. Lorsque la méthode Web est terminée, un événement est déclenché. Il existe un bel exemple vous pouvez lire ici si vous pensez que cela pourrait aider.

Bien que vous puissiez envisager d'effectuer des opérations asynchrones dans votre méthode Web, vous travaillez avec des threads et / ou le pool de threads dans asp.net, qui dispose déjà d'opérations multi-threads. Bien que techniquement réalisable, vous pouvez également, par inadvertance, voler des ressources au système, car httpruntime gère les ressources en répondant aux demandes adressées à votre service.

L'écriture dans le fichier log4net local et l'importation de ces données dans une routine hors ligne est une disponibilité supérieure à la journalisation en temps réel, asynchrone ou autre, car votre serveur SQL peut être hors ligne et votre service est toujours disponible. Si vous n'avez pas besoin du serveur SQL pour autre chose que la journalisation, préférez conserver les opérations de base de données hors de la méthode Web.

S'il ne s'agit que d'un appel sans préavis pour le client, votre service Web peut simplement ajouter les détails à une file d'attente et revenir au client. J'ai utilisé MSMQ pour implémenter quelque chose de similaire à ce que vous décrivez. Cela ne résout pas le délai d'expiration de la base de données, mais élimine le message d'erreur de vos clients.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top