22 Stimmen

Führen Sie eine gespeicherte Prozedur aus einem Windows-Formular asynchron aus und trennen Sie sich dann?

Ich rufe eine gespeicherte Prozedur aus meiner Anwendung auf, die bis zu 30 Minuten dauern kann, um ausgeführt zu werden.

Ich möchte nicht, dass mein Benutzer die Anwendung die ganze Zeit geöffnet lassen muss. Daher möchte ich die Prozedur aufrufen, sie ausführen lassen und es ihnen erlauben, die Anwendung zu schließen und später zurückzukommen.

Wie kann ich das tun?

0 Stimmen

Nun, ich werde mich nicht einloggen oder registrieren (etwas enttäuscht, dass ich nicht abstimmen oder dies ohne dies schließen kann). Jedenfalls hat Scott W. die beste Antwort gegeben und wurde dann von einigen unterstützenden Beiträgen unterstützt. Alle außer dem "...schnellere Hardware kaufen" Teil. Ich würde lieber ein Versagen zugeben, als meinem Kunden sagen, dass sie schnellere Hardware kaufen müssen, weil ich es nicht richtig machen kann. Vielen Dank für all deine Hilfe!

2 Stimmen

@Dan - Ich bin verwirrt. Du bist bereits angemeldet, zumindest genug, um ein Benutzerkonto und 2 Abzeichen zu haben. Warum kannst du nicht auf die Schaltfläche "Antwort akzeptieren" klicken?

0 Stimmen

3voto

mmx Punkte 400975

Sie können die BeginExecuteXXX/EndExecuteXXX Methoden (je nachdem, ob sie ein Ergebnis zurückgibt oder nicht) des SqlCommand verwenden und einen Rückruf-Delegaten übergeben.

0 Stimmen

Ich weiß nicht, warum Leute ohne Erklärung negativ abstimmen. Dies ist eine völlig gültige Antwort, wenn sie das Verfahren ausführen möchten, ohne das Programm vollständig herunterzufahren.

0 Stimmen

Ich kann den Grund erraten: Der ThreadPool-Thread, der für BeginXXX verwendet wird, wird abgebrochen, wenn der Hauptthread beendet wird. Allerdings gehe ich davon aus, dass der OP die App im Hintergrund geöffnet lassen möchte, anstatt den Prozess vollständig zu beenden (was ich für eine gültige Annahme halte).

0 Stimmen

Ich wollte nicht abstimmen, wenn ich das getan habe (neu im Forum, also könnte ich aus Versehen darauf geklickt haben und nicht realisiert haben, was ich tat). Ich stimme zu, perfekte Lösung...aber leider möchte ich sie nicht komplett ausschließen. Danke Mehrdad.

3voto

Scott Whitlock Punkte 13581

Ich schlage eine Neugestaltung vor. Erstellen Sie eine "Arbeitswarteschlange"-Tabelle, in der Sie Anfragen zum Ausführen des gespeicherten Verfahrens protokollieren. Lassen Sie dann entweder einen Windows-Dienst oder einen SQL Server-Job von Zeit zu Zeit diese Arbeitswarteschlange überprüfen (oder seien Sie wirklich einfallsreich und verwenden Sie einen Trigger), um das gespeicherte Verfahren zu starten. Lassen Sie das gespeicherte Verfahren den Fortschritt von Zeit zu Zeit in der Arbeitswarteschlangentabelle aktualisieren, und Ihre Oberfläche kann diesen Fortschritt betrachten und dem Benutzer den Fortschritt mitteilen und dann die Ergebnisse anzeigen, wenn sie fertig sind.

0 Stimmen

Nun, ich werde mich nicht einloggen oder mich registrieren (etwas enttäuscht, dass ich das nicht ohne diese Funktion abstimmen oder schließen kann). Wie auch immer, das war die beste Antwort für mich und wurde dann von einigen unterstützenden Beiträgen unterstützt. Alles, außer dem "...schnellere Hardware kaufen" -Teil. Ich würde lieber ein Versagen einräumen, als meinem Kunden zu sagen, dass sie eine schnellere Hardware kaufen müssen, weil ich es nicht richtig hinbekomme. Vielen Dank für all deine Hilfe!

0 Stimmen

@Dan - das "schnellere Hardware kaufen" war nur ein Scherz. Ich werde es bearbeiten, um es zu entfernen. Aber schnellere Hardware ist manchmal eine Option. Du wirst jedoch keine Hardware finden, die 30 Mal schneller ist! ;)

2 Stimmen

@Scot, Du beschreibst im Grunde genommen eine integrierte Funktion: Service Broker-Aktivierung. Sowohl die interne als auch die externe Aktivierung sind wahrscheinlich besser als ein Windows-Dienst oder ein Agenten-Job, der von Zeit zu Zeit überprüft wird.

2voto

Thorarin Punkte 45433

Wenn Sie Ihre Anwendung wirklich vollständig herunterfahren möchten, empfehle ich Ihnen, einen Job im SQL Server Agent zu definieren und einfach ein T-SQL-Statement auszuführen, um diesen Job manuell zu starten. Die Syntax lautet:

sp_start_job 
     {   [@job_name =] 'job_name'
       | [@job_id =] job_id }
     [ , [@error_flag =] error_flag]
     [ , [@server_name =] 'server_name']
     [ , [@step_name =] 'step_name']
     [ , [@output_flag =] output_flag]

Der Job würde Ihr gespeichertes Verfahren ausführen. Sie müssen ein wenig kreativ sein, um Argumente zu übergeben. Zum Beispiel fügen Sie die Parameter in eine "Warteschlange" Tabelle ein und lassen Sie den Job alle Zeilen in der Warteschlange verarbeiten.

Anstelle eines Jobs sollte auch ein INSERT-Trigger auf Ihrer Warteschlange funktionieren.

2voto

Ed Power Punkte 7915

Ich bevorzuge die Verwendung eines Hintergrunddienstes für die Offline-Verarbeitung, bei dem Ihre Benutzer-App dem Dienst mitteilt, was zu tun ist, und sich dann trennt. Der Dienst kann die vergangene Zeit protokollieren und Fehler/Status anzeigen und bei Bedarf neu starten. WCF ist dafür konzipiert und unterstützt Warteschlangen zur Kommunikation.

2 Stimmen

Remus hatte eine gute Antwort, und ich schätze es, dass er sich die Zeit genommen hat, den Blog-Artikel zu veröffentlichen. Das wäre viel weniger Arbeit, als einen separaten Hintergrunddienst zu erstellen, wenn es auf Ihr Problem zutrifft.

1voto

Ben Lesh Punkte 106494

Lassen Sie sie die App schließen und später zurückkommen

Wenn Sie ihnen erlauben, die App vollständig zu schließen, müssen Sie einen separaten .exe oder etwas in einem anderen ThreadPool starten, der Ihren Code aufruft, um die gespeicherte Prozedur auszuführen. Andernfalls wird Ihr Thread sterben, wenn Sie die App schließen.

0 Stimmen

Ich stimme zu, wenn Sie möchten, dass Ihre Anwendung geschlossen werden kann, müssen Sie den Aufruf des Sproc vollständig aus dem ursprünglichen Prozess verschieben.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X