Pregunta

Tengo un servicio web simple asmx que solo necesita registrar algo de información en una base de datos transaccional. Sin embargo, es el tiempo de espera para el cliente. La llamada para actualizar la base de datos simplemente llama a 1 procedimiento almacenado y no creo que pueda optimizarse aún más para un mejor rendimiento. Me he reducido a solo registrar la ejecución utilizando log4net y luego leer el inicio de sesión mediante un proceso independiente que actualiza la base de datos.

Me preguntaba si hay una mejor manera de hacer esto. Me preguntaba si hay una manera de hacer que mi código haga algo como:

public bool method(...)
{
  LogRun(...)

  Asynchronously call method to insert transaction

  return true;  
}
¿Fue útil?

Solución

EDITAR: Me equivoqué con BackgroundWorker. Así que lo cambié a la versión Thread, probado.

Si desea que el trabajo se realice de forma asíncrona, puede estudiar cómo iniciar otro hilo.

public class Service1 : System.Web.Services.WebService
{

    [WebMethod]
    public void Log(int foo, int bar)
    {
        Thread a = new Thread(new ThreadStart(delegate()
        {
            // Do some processing here
            // For example, let it sleep for 10 secs
            Thread.Sleep(10000);
        }));
        a.Start();
    }
}

El método de registro tardaría 10 segundos en finalizar el procesamiento si la línea Thread.Sleep (10000) está en el propio método de registro. Sin embargo, con Thread a , el método de registro volverá inmediatamente después de la llamada.

También tenga en cuenta que, con este estilo de llamada asíncrona, no hay una manera fácil de garantizar al cliente que realiza la llamada si se completa o no la operación de inserción.

Otros consejos

Una cosa que puede intentar es Rastreo .

Si no se puede seguir optimizando la consulta, puede aumentar el valor de tiempo de espera para su cliente SQL suponiendo que esté utilizando un servidor SQL.

En el lado del cliente que consume el servicio web, puede usar ese método de forma asíncrona si desea que el cliente continúe realizando otras operaciones. Cuando el método web haya finalizado, se activará un evento. Hay un pequeño ejemplo que puede leer aquí Si crees que podría ayudar.

Si bien puede observar hacer operaciones asíncronas dentro de su método web, está trabajando con subprocesos y / o la agrupación de subprocesos dentro de asp.net, que ya cuenta con operaciones de subprocesos múltiples en juego. Aunque técnicamente es factible, también puede robar involuntariamente los recursos del sistema, ya que httpruntime administra los recursos para atender las solicitudes de su servicio.

Escribir en el archivo log4net local e importar esos datos en una rutina fuera de línea es una mayor disponibilidad que el registro en tiempo real, asíncrono o de otro tipo, ya que su servidor SQL puede estar fuera de línea y su servicio aún está disponible. Si no necesita un servidor SQL para otra cosa que no sea el registro, prefiera mantener las operaciones db fuera del método web.

Si es solo una llamada de fuego y olvido para el cliente, su servicio web podría simplemente agregar los detalles a una cola y regresar al cliente. He usado MSMQ para implementar algo similar a lo que estás describiendo. No corrige el tiempo de espera de la base de datos, pero elimina el mensaje de error de sus clientes.

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