Share via


Utilisation des délais

Utilisez les délais pour spécifier le temps maximal d'attente que l'appelant supportera pour l'exécution d'un appel à une méthode.

Un délai peut prendre la forme d'un paramètre pour l'appel à une méthode, comme ci-dessous.

server.PerformOperation(timeout)
server.PerformOperation(timeout);

Par ailleurs, un délai peut s'utiliser comme propriété sur la classe du serveur, comme ci-dessous.

server.Timeout = timeout
server.PerformOperation()
server.Timeout = timeout;
server.PerformOperation();   

Vous devez pencher pour la première approche parce que l'association entre l'opération et le délai est plus explicite. L'approche basée sur la propriété est plus efficace si la classe du serveur est conçue pour être un composant utilisé avec des concepteurs visuels.

Jusqu'ici, des entiers représentaient les délais. Il n'est pas toujours facile d'utiliser des délais entiers parce que l'unité du délai n'est pas explicite et qu'il est difficile de convertir des unités de temps en millisecondes souvent utilisées.

Une meilleure approche consiste à utiliser la structure TimeSpan comme type de délai. TimeSpan résout les problèmes liés aux délais mentionnés ci-dessus. L'exemple de code suivant montre comment utiliser un délai de type TimeSpan.

Public Class Server
   Public Sub PerformOperation(timeout As TimeSpan)
      ' Insert code for the method here.
      Console.WriteLine("performing operation with timeout {0}", _
        timeout.ToString())
   End Sub
End Class
public class Server
{
   public void PerformOperation(TimeSpan timeout)
   {
      // Insert code for the method here.
      Console.WriteLine("performing operation with timeout {0}", 
        timeout.ToString());
   }
}

Si le délai a la valeur TimeSpan(0), la méthode doit lever une exception si l'opération n'est pas immédiatement terminée. Si le délai a la valeur TimeSpan.MaxValue, l'opération doit attendre indéfiniment sans dépasser le délai, comme si aucun délai n'avait été défini. Il est inutile qu'une classe du serveur prenne en charge l'une de ces valeurs, mais elle doit lever ArgumentException si une valeur de délai non prise en charge est spécifiée.

Si un délai expire et si une exception est levée, la classe du serveur doit annuler l'opération sous-jacente.

Si un délai par défaut est utilisé, la classe du serveur doit disposer d'une propriété statique spécifiant le délai à utiliser si l'utilisateur n'en spécifie aucune. L'exemple de code suivant illustre l'implémentation d'une propriété qui spécifie le délai par défaut.

Class ServerWithDefault
   Private Shared defaultTimeout As New TimeSpan(1000)
   
   Public Overloads Sub PerformOperation()
      Me.PerformOperation(DefaultOperationTimeout)
   End Sub 
   
   Public Overloads Sub PerformOperation(timeout As TimeSpan)
      ' Insert code here.
      Console.WriteLine("performing operation with timeout {0}", _
        timeout.ToString())
   End Sub 
   
   Public Shared ReadOnly Property DefaultOperationTimeout As TimeSpan
      Get
         Return defaultTimeout
      End Get
   End Property
End Class 
class ServerWithDefault
{
   static TimeSpan defaultTimeout = new TimeSpan(1000); 

   public void PerformOperation()
   {
      this.PerformOperation(DefaultOperationTimeout);
   }

   public void PerformOperation(TimeSpan timeout)
   {
      // Insert code here.
      Console.WriteLine("performing operation with timeout {0}", 
        timeout.ToString());
   }

   public static TimeSpan DefaultOperationTimeout
   {
      get
      {
         return defaultTimeout;
      }
   }
}

Les types incapables de résoudre les délais en un type TimeSpan doivent arrondir ce délai à l'intervalle le plus proche qui puisse être trouvé. Par exemple, un type qui peut uniquement attendre par incréments d'une seconde doit arrondir à la seconde la plus proche. Une valeur arrondie à zéro constitue une exception à cette règle. Dans ce cas, le délai doit être arrondi au délai minimal. L'arrondissement à une valeur différente de zéro évite les boucles d'attente dans lesquelles une valeur de délai de zéro provoque l'utilisation à 100 % du processeur.

De plus, il est recommandé de lever une exception lorsqu'un délai expire plutôt que de retourner un code d'erreur. L'expiration d'un délai signifie que l'opération n'a pas pu s'effectuer correctement et qu'elle doit par conséquent être traitée et gérée comme n'importe quelle erreur d'exécution. Pour plus d'informations, consultez Instructions de conception pour les exceptions.

Au cas où une opération asynchrone dispose d'un délai, il faut appeler la fonction de rappel et lever une exception lorsqu'on accède en premier aux résultats de l'opération. L'exemple de code suivant l'illustre.

Sub OnReceiveCompleted(ByVal sender As System.Object, ByVal asyncResult As ReceiveCompletedEventArgs)
   Dim queue As MessageQueue = CType(sender, MessageQueue)
   ' The following code will throw an exception
   ' if BeginReceive has timed out.
   Dim message As Message = queue.EndReceive(asyncResult.AsyncResult)
   Console.WriteLine(("Message: " + CStr(message.Body)))
   queue.BeginReceive(New TimeSpan(1, 0, 0))
End Sub 
void OnReceiveCompleted(Object sender, ReceiveCompletedEventArgs asyncResult)
{
   MessageQueue queue = (MessageQueue) sender;
   // The following code will throw an exception
   // if BeginReceive has timed out.
   Message message = queue.EndReceive(asyncResult.AsyncResult);
   Console.WriteLine("Message: " + (string)message.Body);
queue.BeginReceive(new TimeSpan(1,0,0));
}

Portions Copyright 2005 Microsoft Corporation. Tous droits réservés.

Portions Copyright Addison-Wesley Corporation. Tous droits réservés.

Pour plus d'informations sur les instructions de conception, consultez le livre « Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries » de Krzysztof Cwalina et Brad Abrams, publié par Addison-Wesley, 2005.

Voir aussi

Concepts

Indications relatives à l'utilisation

Autres ressources

Instructions de conception pour le développement de bibliothèques de classes
Modèles de design pour la programmation asynchrone