Domanda

Ho un semplice servizio web asmx che deve solo registrare alcune informazioni in un database transazionale. Tuttavia sta scadendo per il client. La chiamata per aggiornare il database chiama solo 1 procedura memorizzata e non credo che possa essere ulteriormente ottimizzata per prestazioni migliori. Sono stato ridotto a registrare semplicemente la corsa usando log4net e quindi a leggere il login con un processo separato che aggiorna il database.

Mi chiedevo se ci fosse un modo migliore per farlo. Mi chiedevo se c'è un modo per fare in modo che il mio codice faccia qualcosa del tipo:

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

  Asynchronously call method to insert transaction

  return true;  
}
È stato utile?

Soluzione

EDIT: mi sbagliavo su BackgroundWorker. Quindi l'ho collegato alla versione Thread, testata.

Se vuoi che il lavoro venga svolto in modo asincrono, puoi studiare come iniziare un altro thread.

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

Il completamento del processo Log richiederebbe 10 secondi se la riga Thread.Sleep (10000) si trova nel metodo Log stesso. Tuttavia, con Thread a , il metodo Log tornerà immediatamente dopo la chiamata.

Si noti inoltre che non esiste un modo semplice per garantire al client chiamante se l'operazione di inserimento è stata completata o meno, con questo stile di chiamata asincrona.

Altri suggerimenti

Una cosa che potresti voler provare è Tracing .

Se la query non può essere ulteriormente ottimizzata, è possibile aumentare valore di timeout per il tuo client SQL supponendo che potresti utilizzare SQL server.

Sul lato client che utilizza il servizio Web, è possibile utilizzare quel metodo in modo asincrono se si desidera che il client continui a eseguire altre operazioni. Al termine, il metodo Web attiverà un evento. C'è un piccolo esempio puoi leggere qui se pensi che possa aiutare.

Mentre puoi guardare a fare operazioni asincrone all'interno del tuo metodo web, stai lavorando con thread e / o threadpool all'interno di asp.net, che ha già in gioco operazioni multi-thread. Sebbene tecnicamente fattibile, puoi anche inavvertitamente derubare il sistema di risorse poiché httpruntime gestisce le risorse nel servire le richieste al tuo servizio.

Scrivere nel file log4net locale e importare quei dati in una routine offline è una disponibilità maggiore rispetto alla registrazione in tempo reale, asincrona o meno, poiché il tuo server sql può essere offline e il tuo servizio è ancora disponibile. Se non hai bisogno di sql server per qualcosa di diverso dalla registrazione, preferisci mantenere le operazioni db fuori dal metodo web.

Se si tratta solo di una chiamata di emergenza per il client, il servizio Web potrebbe semplicemente aggiungere i dettagli a una coda e tornare al client. Ho usato MSMQ per implementare qualcosa di simile a quello che stai descrivendo. Non risolve un timeout del database ma allontana il messaggio di errore dai client.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top