2009-10-12 24 views
7

Tenemos un servicio para actualizar la información del cliente al servidor. Una llamada de servicio demora unos segundos, lo cual es normal.Fire and Forget (Asynch) ASP.NET Method Call

Ahora tenemos una nueva página donde en una instancia alrededor de 35-50 información de los clientes se puede actualizar. Cambiar la interfaz del servicio para que acepte a todos los clientes juntos está fuera de discusión en este momento.

Necesito llamar a un método (digamos "ProcessCustomerInfo"), que recorrerá la información de los clientes y llamará al servicio web 35-50 veces. El servicio de llamada de forma asincrónica no es de mucha utilidad.

Necesito llamar al método "ProcessCustomerInfo" de forma asíncrona. Estoy tratando de usar RegisterAsyncTask para esto. Hay varios ejemplos disponibles en la web, pero el problema es que después de iniciar esta llamada, si me alejo de esta página, el proceso se detiene.

¿Es posible implementar el método Fire and Forget para que el usuario pueda alejarse (redirigir a otra página) desde la página sin detener el procesamiento del método?

Respuesta

8

detalles sobre: ​​http://www.codeproject.com/KB/cs/AsyncMethodInvocation.aspx

Básicamente se puede crear un delegado que apunta al método que desea ejecutar de forma asincrónica y luego golpearlo con BeginInvoke.

// Declare the delegate - name it whatever you would like 
public delegate void ProcessCustomerInfoDelegate(); 

// Instantiate the delegate and kick it off with BeginInvoke 
ProcessCustomerInfoDelegate d = new ProcessCustomerInfoDelegate(ProcessCustomerInfo); 
simpleDelegate.BeginInvoke(null, null); 

// The method which will run Asynchronously 
void ProcessCustomerInfo() 
{ 
    // this is where you can call your webservice 50 times 
} 
+0

Gracias Joel! Vi este método antes, pero lo ignoré porque MethodInvoker es parte de System.Windows.Form. Parece que funciona bien con Redirection, aunque necesito hacer más pruebas. Pero, ¿debería usar este método para ASP.NET? ¿O hay alguna alternativa web a esto? – BinaryHacker

+0

Vaya, sí, lo siento. Funcionaría bien con ASP.NET, pero sería una pena tener que incluir System.Windows.Form en su proyecto si no es necesario. En su lugar, puede crear su propio delegado y usarlo en lugar de MethodInvoker. He actualizado el ejemplo de código anterior. –

+1

MethodInvoke es simplemente un delegado ya creado para usted sin parámetros ni valores devueltos, por lo que no tiene que tomarse el tiempo para crear uno propio. ProcessCustomerInfoDelegate que acabamos de crear funciona exactamente de la misma manera. –

0

Creo que el problema es que su servicio web espera que un cliente devuelva la respuesta, que la llamada de servicio en sí misma no es una comunicación de una sola vía.

Si está utilizando WCF para sus servicios web, mire http://moustafa-arafa.blogspot.com/2007/08/oneway-operation-in-wcf.html para realizar una llamada de servicio de ida.

Mis dos centavos: IMO quienquiera que ponga el constructo en usted que no puede alterar la interfaz de servicio para agregar un nuevo método de servicio es el que hace demandas poco razonables. Incluso si su servicio es una API consumida públicamente, agregar un nuevo método de servicio no debería afectar a ningún consumidor existente.

+0

problema no está recibiendo respuesta del servicio, pero llamar al servicio técnico 50 veces.La llamada al servicio unidireccional no me ayudará aquí. Necesito encontrar la manera de llamar al método que realmente está realizando llamadas de servicio ....... Cambiar la interfaz es un problema ya que este otro proveedor expone este servicio. no están dispuestos a cambiarlo en este momento. – BinaryHacker

+0

La llamada de servicio unidireccional resolvería sus problemas, no tendría que dispararlos todos asíncronamente, ya que abrirían su solicitud para activar los datos y cerrar la conexión cuando, al presionar enviar o lo que sea que haga su página, simplemente termine en un segundo y está hecho. Sin embargo, si no posee el servicio, no puede cambiarlo para que sea de 1 vía. –

0

Seguro que can.

+0

Gracias. Este es el método que estoy intentando actualmente. Pero el problema es la película fuera de la página. Si el usuario hace clic en cualquiera de los enlaces para pasar a otra página, también se detiene el procesamiento de asincronización. – BinaryHacker

+0

@ExpertSoul: parece poco probable que el procesamiento de asincronización se detenga cuando cambia de página, porque según el documento al que Restuta está vinculado, las tareas asíncronas deben completarse antes de que se procese la página (antes de que se entregue al navegador). ¿Recordó agregar una directiva de página con un atributo Async = "true" o establecer la propiedad AsyncMode de la página en "true"? Algo me dice que sus tareas asincrónicas pueden no ejecutarse en absoluto. –

+0

@ paper1337 - acaba de verificarlo nuevamente. Con la instrucción Redirection, se llama al método "OnBegin" pero las operaciones expiran para que vuelva a la página. Pero OnBegin se procesa hasta el final. Con una instrucción de redirección (que puse justo después de la llamada al método asincrónico) "OnBegin" nunca se llama. Además, aunque se menciona en todas partes para especificar la propiedad Async = "true", no vi ninguna diferencia en el procesamiento con o sin él. – BinaryHacker

3

Esto era algo que azotaron acaba de hacer eso ...


    public class DoAsAsync 
    { 
     private Action action; 
     private bool ended; 

     public DoAsAsync(Action action) 
     { 
      this.action = action; 
     } 

     public void Execute() 
     { 
      action.BeginInvoke(new AsyncCallback(End), null); 
     } 

     private void End(IAsyncResult result) 
     { 
      if (ended) 
       return; 

      try 
      { 
       ((Action)((AsyncResult)result).AsyncDelegate).EndInvoke(result); 
      } 
      catch 
      { 
       /* do something */ 
      } 
      finally 
      { 
       ended = true; 
      } 
     } 
    } 

Y luego

new DoAsAsync(ProcessCustomerInfo).Execute();

También es necesario establecer la propiedad asíncrono en la directiva Page <%@ Page Async="true" %>

No estoy seguro de qué tan confiable es esto, sin embargo, funcionó para lo que necesitaba. Escribió esto tal vez hace un año.

+0

Realmente me gusta esta solución. ¿Hay alguna actualización o hallazgos recientemente encontrados, dado que aparentemente la ha estado usando por un tiempo? –

+0

No recuerdo haber tenido problemas con eso. Cuando esta respuesta ya se había utilizado en producción, y todavía está allí. /encogimiento de hombros – Dave