none
Warten nach Methoden / Funktionsaufruf bis die Methode abgelaufen ist RRS feed

  • Allgemeine Diskussion

  • Hallo zusammen,

    ich suche eine Möglichkeit zu warten bis die nächste Funktion aufgerufen wird.

    Derzeit sieht es folgendermaßen aus:

    in der main habe ich die Funktionsaufrufe:

    funktion1();
    funktion2();

    In der Funktion 1 wird ein Powershell Skript ausgeführt, nur leider wird derzeit nicht gewartet bis das PS Skript tatsächlich durchgelaufen ist.

    public void funktion1()
            {
            ProcessStartInfo psi = new ProcessStartInfo();
            psi.FileName = "powershell.exe";
            psi.Arguments = "'test2.ps1'";
            Process process = new Process();
            process.StartInfo = psi;
            process.Start();
            process.WaitForExit();

    }

    Wie bekomme ich es hin das darauf gewartet wird bis die erste Funktion fertig durchlaufen ist bevor die zweite Funktion aufgerufen ist ?

    Vielen Dank

    Dienstag, 10. Juli 2012 09:14

Alle Antworten

  • Servus,

    Genau das machst Du doch bereits mit  process.WaitForExit(); Das weis an das an der Stelle so lange gewartet wird bis die Powershell beendet wird.

    Wenn Du was anderes meinst sorry.

    MfG, Ulf

    Dienstag, 10. Juli 2012 09:23
  • Hi vielen Dank schonmal für die schnelle Antwort.

    Ja das dachte ich auch das ich das mit WaitForExit(); mache, aber das scheint noch nicht so richtig zu funktionieren.

    Vielleicht hole ich nochmal ein bisschen aus.

    Es ist so das meine Anwendung ein Windows Dienst ist, wenn ich mein skript auseinender baue und einzeln compiliere funktioniert das auch wunderbar.
    Aber wenn ich das als Dienst installiert habe führt er das Powershell skript nicht aus, dort werden Verbindungen zu unterschiedlichen Systemen erstellt, die auch etwas länger dauern können.
    Da hab ich mir gedacht evtl. sind die beiden Funktionsaufrufe zu schnell hintereinander, bzw. die erste Funktion mit dem ersten PS Skript wird unterbrochen.

    Daher habe ich gedacht es gibt noch eine andere Möglichkeit zu warten bis das Powershell Skript wirklich durchgelaufen ist.

    Dienstag, 10. Juli 2012 09:35
  • Hi,

    dann hast Du falsch gedacht. Die Aufrufe erfolgen nacheinander.

    Ich tippe eher auf ein Berechtigungs- oder Verständnisproblem. Ein Dienst ist in vielen Dingen anders zu behandel als eine normale Winforms Anwendung.

    Mit welchem Account wird der Dienst denn ausgeführt? Darf der Account ins Netzwerk?

    Setz mal ein Try...Catch um die betreffenden Zeilen und protokollier die vollständige Fehlermeldung, bspw. in eine Datei.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Dienstag, 10. Juli 2012 09:50
    Moderator
  • Hi,

    Ja der Benutzer ist Dom. Admin... der darf alles :P
    Ich versuche mal die Fehler zu protokollieren und werde mich dann nochmal melden danke

    Dienstag, 10. Juli 2012 11:12
  • Hey,

    Try and Catch habe ich drum gebaut, es kommt aber keine Fehlermeldung.

    Der Funktionsaufruf scheint zu funktionieren, aber ich glaube das er nicht darauf wartet und zur nächsten Funktion springt.

    Hast du noch eine Idee ?

    In einem anderen teil des Dienstes funktioniert das reibungslos.

    Allerdings dauert das laden der entsprechenden Cmdlets doch etwas länger, vielleicht bricht das dann irgendwo ab weil er die zweite Funktion anstartet ?

    Montag, 16. Juli 2012 10:17
  • Hallo too1234,

    bist du sicher, dass das Skript überhaupt von C# aus ausgeführt wird? (Stichwort: Powershell Ausführungsrichtlinie) Nur weil es über manuellen Start in der Konsole läuft, heißt das nicht, dass es auch durch direkten Aufruf gestartet wird. Mehr dazu findest du via Powershell hier: get-help about_signing

    Das würde erklären weshalb der Vorgang so schnell abgeschlossen ist.

    Gruß Sebastian

    Mittwoch, 18. Juli 2012 13:34
  • hallo tool1234,

    versuch mal folgender Lösung:

    bool working = false;
    private void funk1()
    {
    	if (working )
    	{
       		System.Threading.Thread.Sleep(60 * 1000 );
    	}
    	else
    	{
    		working = true;
    		// doSomting
    		working = false;
    	}
    }
    private void funk2()
    {
    	if (working )
    	{
       		System.Threading.Thread.Sleep(60 * 1000 );
    	}
    	else
    	{
    		working = true;
    		// doSomting
    		working = false;
    	}
    }

    Donnerstag, 19. Juli 2012 10:39
  • ****************************************************************************************************************
    Dieser Thread wurde mangels weiterer Beteiligung des Fragestellenden ohne bestätigte Lösung abgeschlossen.
    Neue Rückfragen oder Ergänzungen zu diesem Thread bleiben weiterhin möglich.
    ****************************************************************************************************************

    Robert Breitenhofer, MICROSOFT  Twitter Facebook
    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Montag, 30. Juli 2012 10:50
    Moderator