Pregunta

Tengo una página en la que cuando alguna operación sale mal, quiero iniciar el temporizador, esperar 30 segundos, detener el temporizador y volver a intentar la operación. Cada vez que se inicia el temporizador, necesito informar al usuario al cambiar el texto de alguna etiqueta.

¿Cómo puedo hacerlo?

¿Fue útil?

Solución

Si entiendo correctamente, creo que debería usar un temporizador del lado del cliente (javascript) en su lugar. No puedes usar un temporizador del lado del servidor para esto.

Cuando detecta la condición de error, actualiza la etiqueta en consecuencia y la muestra al usuario. Al mismo tiempo, invoca un temporizador del lado del cliente que se devolverá después de 30 segundos.

Por ejemplo, ponga el siguiente código de temporizador en su página:

  <script>
    function StartTimer()
    {
      setTimeout('DoPostBack()', 30000); // call DoPostBack in 30 seconds
    }
    function DoPostBack()
    {
      __doPostBack(); // invoke the postback
    }
  </script>

En el caso de la condición de error, debe asegurarse de que el temporizador del lado del cliente se iniciará:

if (error.Code == tooManyClientsErrorCode)
{
  // add some javascript that will call StartTimer() on the client
  ClientScript.RegisterClientScriptBlock(this.GetType(), "timer", "StartTimer();", true);
  //...
}

Espero que esto ayude (el código no se ha probado, ya que no tengo un estudio visual disponible en este momento).

Actualización :

Para " simular " al hacer clic en el botón, debe pasar al ID de cliente del botón al método __doPostBack (), por ejemplo:

function DoPostBack()
{
  var buttonClientId = '<%= myButton.ClientID %>';
  __doPostBack(buttonClientId, ''); // simulate a button click
}

Para otras posibilidades, vea la siguiente pregunta / respuesta:

Otros consejos

desde el lado del cliente para forzar una devolución de datos, puede llamar directamente al método __doPostBack

Toma dos argumentos, EVENTTARGET y EVENTARGUMENT; ya que está realizando esta llamada fuera del ciclo asp.net normal, deberá verificar IsPostBack en el evento de carga de su página (o init, su elección): si es una devolución de datos, tendrá que analizar esos dos argumentos que se presentan. como elementos de formulario (Request.Form [" __ EVENTTARGET "]). Verifique su valor para ver si la devolución vino de su llamada o de uno de los otros controles, si el valor de esos coincide con lo que pasa desde el lado del cliente, entonces haga su cambio a la prueba de etiquetas

Dos formas de hacer esto, en primer lugar, un poco mejor si necesita llamar a otras funciones en el mismo hilo. Agregue un ScriptManager y un temporizador a la página aspx, puede soltar desde la caja de herramientas o simplemente ingresar el código. ScriptManager debe ser declarado antes de asp: Timer. OnTick se dispara después de cada intervalo.

    <asp:ScriptManager ID="ScriptManager1" runat="server">
    </asp:ScriptManager>
    <asp:Timer ID="Timer1" runat="server" Interval="4000" OnTick="Timer1_Tick">
    </asp:Timer>

En el código detrás (c # en este caso):

    protected void Timer1_Tick(object sender, EventArgs e)
    {
        System.Diagnostics.Debug.WriteLine("tick tock");
    }

La segunda forma no es tan buena si necesitas que las funciones se activen en el mismo hilo. Puede hacer un temporizador en ASP.net usando C #, el siguiente código activa la función cada 2 segundos. En el código detrás del archivo (.cs):

    // timer variable
    private static System.Timers.Timer aTimer;

    protected void Page_Load(object sender, EventArgs e)
    {
        // Create a timer and set a two second interval.
        aTimer = new System.Timers.Timer();
        aTimer.Interval = 2000;

        // Hook up the Elapsed event for the timer. 
        aTimer.Elapsed += OnTimedEvent;

        // Have the timer fire repeated events (true is the default)
        aTimer.AutoReset = true;

        // Start the timer
        aTimer.Enabled = true;
    }

Luego haga la función que desea llamar en este formato:

//Doesn't need to be static if calling other non static functions

    private static void OnTimedEvent(Object source, System.Timers.ElapsedEventArgs e)
    {
        System.Diagnostics.Debug.WriteLine("The Elapsed event was raised at {0}", e.SignalTime);
    }

Salida de muestra:

 Salida

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top