Frage

Ich habe einen einfachen asmx Web-Service bekommt, die benötigt nur einige Informationen zu einer Transaktions Datenbank zu protokollieren. Jedoch ist es Timing für die Kunden aus. Der Aufruf, die Datenbank zu aktualisieren, ruft nur 1 gespeicherte Prozedur, und ich glaube nicht, dass es für eine bessere Leistung weiter optimiert werden kann. Ich habe nur reduziert den Lauf mit log4net Protokollierung und dann das Protokoll in durch einen separaten Prozess zu lesen, die die Datenbank aktualisiert.

Ich habe mich gefragt, ob es ein besserer Weg, dies zu tun. Ich frage mich, ob es ein Weg ist meinen Code so etwas wie zu machen:

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

  Asynchronously call method to insert transaction

  return true;  
}
War es hilfreich?

Lösung

EDIT: Ich war falsch über Background. Also habe ich es zum Thema Version chaged, getestet.

Wenn Sie die Arbeit wollen asynchron ausgeführt, können Sie untersuchen, wie ein anderer Thread zu starten.

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

Es würde 10 Sekunden für Log-Verfahrensbearbeitung zu beenden, wenn die Thread.Sleep (10000) Zeile in der Log-Methode selbst ist. Doch mit Fädeln a , die Log-Methode wird unmittelbar nach dem Aufruf zurück.

Beachten Sie auch, dass es keine einfache Möglichkeit ist es zu gewährleisten, um den rufenden Client, wenn der Einsatz abgeschlossen ist oder nicht, mit dieser Art von asynchronem Aufruf.

Andere Tipps

Eine Sache, die Sie versuchen wünschen können Tracing .

Wenn die Abfrage nicht optimiert werden kann, weiter konnte man die Timeout-Wert für Ihren SQL-Client vorausgesetzt, Sie können SQL-Server verwenden.

Auf der Client-Seite, die die Webdienst verbraucht, können Sie diese Methode asynchron verwenden, wenn Sie den Client mögen andere Operationen weiterhin durchführen. Wenn die Web-Methode abgeschlossen ist, wird es ein Ereignis auslösen. Es ist ein nettes kleines Beispiel lesen Sie hier , wenn Sie denken, es könnte helfen.

Während Sie tun asynchrone Operationen in Ihrem Webmethod aussehen können, Sie arbeiten mit einem Gewinde und / oder dem Thread innen asp.net, die bereits Multi-Threading-Operationen im Spiel hat. Obwohl es technisch möglich, können Sie auch versehentlich rob das System von Ressourcen wie die Httpruntime Ressourcen verwaltet Anfragen an Ihren Service zu dienen.

Schreiben an die lokale log4net-Datei und importieren diese Daten in einer Offline-Routine ist eine höhere Verfügbarkeit als Echtzeit-Logging, asynch oder auf andere Weise, da SQL Server offline sein kann und Ihr Service ist nach wie vor vorhanden. Wenn Sie nicht über SQL Server für andere etwas benötigen, als die Protokollierung, lieben db-Operationen aus dem Webmethod zu halten.

Wenn es nur ein fire-and-forget rufen für die Kunden, Ihr Web-Dienst konnte nur die Details zu einer Warteschlange hinzufügen und an den Client zurück. Ich habe MSMQ verwendet, um etwas zu implementieren, ähnlich dem, was Sie beschreiben. Sie stellen keine Datenbank-Timeout zu beheben, aber es tut, um die Fehlermeldung weg von Ihren Kunden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top