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

1voto

Joshua Punkte 7942

Ein weiterer möglicher Ansatz wäre, es Ihrer Anwendung zu erlauben, im Hintergrund (möglicherweise im Benachrichtigungsbereich) zu laufen und dann zu beenden oder zu benachrichtigen, wenn der Job abgeschlossen ist. Sie könnten dies erreichen, indem Sie die Methoden BeginExecuteNonQuery und EndExecuteNonQuery verwenden, um es in einem separaten Thread auszuführen.

0voto

Alan Samet Punkte 1029

Ist das Hauptfenster Ihrer Anwendung nicht geöffnet, bleibt sie dennoch aktiv, solange Sie es als sekundären Thread gestartet haben und IsBackground == false ist. Normalerweise ziehe ich es vor, solche Sachen über den SQL Server Agenten oder als Client-Server-Anwendung zu erledigen (nichts hindert daran, dass eine Client-Server-Anwendung sowohl auf demselben Rechner läuft oder sogar dieselbe Binärdatei ist).

Es ist schon eine Weile her...

using System.Threading;

.....

Thread _t = null;
void StartProcedure()
{
  _t = new Thread(new ThreadStart(this.StartProc));
  _t.IsBackground = false; // Wenn ich mich richtig erinnere, ist das der Standardwert.
  _t.Start();
}

bool ProcedureIsRunning
{
 get { return _t.IsRunning; } // Vielleicht ist es IsActive. Ich kann mich nicht erinnern.
}

void StartProc(object param)
{
  // Ihre Logik hier... Sie könnten dies auch als anonyme Methode tun. Ich habe es vereinfacht, um es übersichtlich zu halten.
}

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