Compartilhar via


Uso time-Out

Use tempos limite para especificar o time máximo que um chamador está disposto a aguardar a conclusão de uma telefonar de método.

Um time limite pode assumir a forma de um parâmetro para a telefonar de método da seguinte maneira.

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

sistema autônomo alternativa, um time limite pode ser usado sistema autônomo a seguir sistema autônomo uma propriedade na classe de servidor.

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

Você deve favorecer a primeira abordagem, porque a associação entre a operação e o time limite é mais clara. A abordagem baseada em propriedade talvez seja melhor se a classe de servidor é projetada para ser um componente usado com designers visuais.

Historicamente, time-transferências de tem sido representados por números inteiros. Tempos limite de número inteiro pode ser difícil usar porque não é óbvio o que é a unidade do time limite e é difícil converter unidades de time em milissegundos comumente usados.

Uma abordagem melhor é usar o TimeSpan estrutura sistema autônomo o tipo de time limite. TimeSpan resolve os problemas com os tempos limite de número inteiro mencionados acima. O exemplo de código a seguir mostra como usar um time limite do tipo 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());
   }
}

Se o time limite é conjunto para TimeSpan(0), o método deve lançar uma exceção se a operação não for concluída imediatamente. Se o time limite é TimeSpan.MaxValue, a operação deve esperar para sempre sem time limite, sistema autônomo se não houvesse nenhum time limite conjunto. Uma classe de servidor não é necessária para oferecer suporte a qualquer um desses valores, mas ele deve gerar um ArgumentException Se for especificado um valor de time limite sem suporte.

Se um time limite expira e uma exceção é lançada, a classe de servidor deve cancelar a operação subjacente.

Se um time limite padrão é usado, a classe de servidor deve incluir uma propriedade estática especificando o time limite para ser usado se o usuário não especifique um. O exemplo de código a seguir demonstra a implementação de uma propriedade que especifica o time limite padrão.

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;
      }
   }
}

Tipos que não é possível resolver tempos limite para a resolução de um TimeSpan deve arredondar o time limite para o intervalo mais próximo que pode ser acomodado. Por exemplo, um tipo que pode esperar apenas em incrementos de um segundo deve arredondar para o segundo mais próximo. Uma exceção a essa regra é quando um valor será arredondado para baixo até zero. Nesse caso, o time limite deve ser arredondado para o time limite mínimo possível. Arredondamento diferente de zero impede loops espera ocupada em que um valor de time limite igual a zero faz com que 100 % de utilização de processador.

Além disso, é recomendável que você lançar uma exceção quando um time limite expira em vez de retornar um código de erro. Expiração de um time limite significa que a operação não foi concluída com êxito e, portanto, deve ser tratada e manipulada sistema autônomo qualquer Outros erro de time de execução. Para obter mais informações, consulte Diretrizes de design para exceções.

No caso de uma operação assíncrono com um time limite, a função de retorno de chamada deve ser chamada e acessado de uma exceção lançada quando os resultados da operação são primeiro. This is illustrated in the following code example.

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));
}

Partes direitos autorais 2005 Microsoft Corporation. Todos os direitos reservados.

Partes direitos autorais Addison-Wesley Corporation. Todos os direitos reservados.

Para obter mais informações sobre diretrizes de design, consulte a "diretrizes de design do estrutura: Catálogo de convenções, idiomas e padrões para bibliotecas do .NET reutilizável"Krzysztof Cwalina e Brad Abrams, publicado pela Addison-Wesley, 2005.

Consulte também

Conceitos

Diretrizes de uso

Outros recursos

Diretrizes de Design para desenvolvimento bibliotecas de classe

Padrões de design de programação assíncrona