2009-01-30 10 views
0

J'ai utilisé ce modèle lorsque j'ai besoin de contrôler combien de temps prennent différentes opérations asynchrones. Je ne veux pas dire spécifiquement pour WebRequest (je sais que vous pouvez définir la propriété timeout), je l'ai juste utilisé comme exemple pour le pattern.À quel point ce patron est-il mauvais?

 var request = WebRequest.Create(someUri); 

     WebResponse response = null; 
     request.BeginGetResponse(result => 
      { 
       var asyncRequest = (WebRequest)result.AsyncState; 
       response = asyncRequest.EndGetResponse(result); 
      }, request); 

     DateTime timeout = DateTime.Now.AddSeconds(10); 
     while (response == null && DateTime.Now <= timeout) 
     { 
      Thread.Sleep(0); 
     } 
     if (response == null) throw new Exception("Timeout!"); 

Partout j'ai lu sur Thread.Sleep(), je l'ai entendu est une chose baaaad à faire, mais je ne pense pas vraiment ce abus de cas l'utiliser.

Je sais qu'il est possible que ce soit un peu plus de exactement 10 secondes, mais ce n'est pas important pour moi.

Donc, est-ce vraiment un mauvais moyen d'accomplir ce que j'accomplis, et si oui, quelle est la meilleure façon de le faire?

EDIT: Peut-être que je devrais clarifier ce que je "essaie d'accomplir

Le but est de contrôler la quantité maximum de temps d'attente sur un appel que je suis conscient que cela va à l'encontre du but d'un async.. . appeler, mais l'intention n'a jamais été d'être asynchrone, je suis juste l'utiliser comme un moyen de contrôler

Répondre

6

quand je sors un appel les WaitHandles attendre les méthodes prend en charge le temps, utiliser que quelque chose comme:.

var asyncResult = request.BeginGetResponse(... 
    asyncResult.AsyncWaitHandle.WaitOne(TimeSpan.FromSeconds(10)) 
+0

Aha! Cela semble tellement évident! –

0

Pour être complet: pour éviter de bloquer le cur thread de location, utilisez System.Threading.Timer.

+0

Il me semble à partir de l'exemple de code que le comportement souhaité est de bloquer le thread en cours. –

+0

Alors pourquoi le rendre asynchrone? –

+0

@Patrik: Oui, mais google le trouvera probablement dans la réponse "timeout async" ou quelque chose comme ça. @Ed: vous pouvez donc attendre. –

1

Le code semble parfaitement bien aussi moi. C'est juste un moyen de prendre en charge la propriété timeout lors d'un appel de synchronisation s'il n'y en a pas dans l'API. Bien que je devrais dire que vous feriez mieux de remplacer cette boucle d'attente par une sorte de classe WaitHandle, elle utilisera moins de ressources et je suis sûr que ça ira mieux. Désolé, je ne peux pas fournir la solution car je ne connais pas C# et c'est bien l'API.

Questions connexes