2009-06-19 5 views
1

J'ai créé un service de test avec une méthode qui contient une très longue boucle. J'espérais que lors d'une transaction timeout, l'exécution de la méthode viderait, mais ce n'est pas le cas. Le client obtient un délai d'attente, mais le traitement se poursuit sur le serveur.Comment arrêter l'exécution d'un appel de méthode dans WCF après un délai de transaction

Y at-il moyen de l'arrêter? Sans changer le code de la méthode?

Voici l'exemple: dans l'exemple j'appelle la méthode QueueRequest en utilisant la liaison de file d'attente, et après 10 secondes la transaction est abandonnée. À ce stade, une nouvelle tentative se produit, provoquant le même problème. Après quelques tentatives, le serveur fait un travail 100% CPU essayant de lancer la boucle sur plusieurs threads/instances même si le message est empoisonné et abandonné.


// NOTE: If you change the class name "Service1" here, you must also update the reference to "Service1" in App.config. 
    [ServiceBehavior(InstanceContextMode=InstanceContextMode.PerCall, 
     TransactionTimeout="00:00:10", 
     ReleaseServiceInstanceOnTransactionComplete=true)] 
    [ErrorHandlingBehaviorAttribute] 
    public class Service1 : IQueueService 
    { 
     public Service1() 
     { 
     Trace.WriteLine("Creating an instance on thread " + Thread.CurrentThread.ManagedThreadId.ToString()); 
     } 

     ~Service1() 
     { 
     Trace.WriteLine("Destroying an instance on thread " + Thread.CurrentThread.ManagedThreadId.ToString()); 
     } 


     [OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = true)] 
     public void QueueRequest(string message) 
     { 
     int id = Thread.CurrentThread.ManagedThreadId; 
     Trace.WriteLine("Got Message on thread " + id.ToString()); 
     for (int i = 0; i < 1000000; i++) 
     { 
      Trace.WriteLine("Processing " + i.ToString() + " Thread ID " + id.ToString()); 
      Thread.Sleep(1000);   
     } 
     } 
    } 

Répondre

1

Je ne pense pas que cela est possible sans modifier votre code existant.

Regardez here et here. Le thread desservant la requête est totalement découplé de la partie de WCF qui fournit les résultats au client.

+0

Merci. pour l'information. – user80855

Questions connexes