Laden...

Stark unterschiedliches Zeitverhalten zwischen Aufruf von Kommandozeile und in C# mit Process.Start

Erstellt von suedsee vor 4 Jahren Letzter Beitrag vor 4 Jahren 1.464 Views
S
suedsee Themenstarter:in
5 Beiträge seit 2019
vor 4 Jahren
Stark unterschiedliches Zeitverhalten zwischen Aufruf von Kommandozeile und in C# mit Process.Start

Hallo,

ich rufe in C# ein exe-Programm (stammt nicht von mir) auf und setze dabei ein Argument. Der Aufruf sieht wie folgt aus:

            Process pc = new Process();
            pc.StartInfo.FileName = @"c:\pfad\programmXY.exe";
            pc.StartInfo.Arguments = "-test";
            pc.Start();
            pc.WaitForExit();
            myReturnCode = pc.ExitCode;

Wenn ich nun in einer DOS-Box (Kommandozeilenaufforderung) folgenden Befehl eingebe:
c:\pfad\programmXY.exe -test
dann dauert die Ausführung (wird auch in einer log-Datei vom aufgerufenen Programm protokolliert) ca. 1,5 Sekunden.

Der obige Aufruf aus C# mit Process.Start dauert aber ca. 26 (in Worten: sechsundzwanzig!) Sekunden!

Das ganze ist beliebig reproduzierbar.

Woran kann das liegen? Wie erreiche ich mit C# eine vergleichbare Ausführungszeit des fremden Programms?

Was mir noch aufgefallen ist: Während der 26 Sekunden hört man die Festplatte stark arbeiten; vielleicht ein Hinweis für die Ursache?

Gruß
suedsee

Hinweis von Abt vor 4 Jahren

Bitte wie bereits gesagt die Code Tags verwenden
[Hinweis] Wie poste ich richtig?

T
2.219 Beiträge seit 2008
vor 4 Jahren

Mal davon abgesehen, dass du gleich zwei Threads aufgemacht hast, solltest du auch mal sagen wo er in deinem Code hängt.
Hängt er am WaitForExit?
Oder dauert der gesamte Durchlauf deines Codes, den wir hier nicht sehen und nicht kennen, so lange?

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

S
suedsee Themenstarter:in
5 Beiträge seit 2019
vor 4 Jahren

Im Debugger hängt er auf dem WaitForExit

sorry, habe bereits die Löschung des versehentlich doppelten threads beantragt

Ergänzung:
Wobei, wenn ich nach Ausführung von pc.Start die 26 Sekunden warte, dann geht er bei pc.WaitForExit() sofort weiter.

T
2.219 Beiträge seit 2008
vor 4 Jahren

Dann wäre eben die Frage ob der Task auch tatsächlich z.B. im Task Manager nach deinen erwarteten 1,5 Sek. nicht mehr angezeigt wird.
Auch müsstest du prüfen ob der Task ggf. selbst länger läuft weil er z.B. auf Resourcen zugreifen will für die dein Benutzer keine Berechtigungen hat.

Z.B. kann es dann sein, dass dein Debug Lauf einen anderen Benutzer oder andere Berechtigungen hat und deshalb bestimmte Zugriffe blockiert werden.
Dies ist aber nur geraten und da es keine Details gibt außer, dass dein Programm beim debuggen hängt, ist es schwer die Ursache zu finden.

Hier braucht es mehr Details um ggf. die Ursache zu finden.

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

16.806 Beiträge seit 2008
vor 4 Jahren

Es ist nahezu auszuschließen, dass es am Process Start selbst liegt.

Es wird viel eher daran liegen, wie eine Applikation jeweils gestartet wird - und der Start über Process.Start() ist eben nicht identisch zur Kommandozeile.
Allein die Tatsache, dass die Kommandozeile eben eine Shell ist und Process.Start nicht kann sowas auslösen.
Ebenso bekommt die Anwendung über die Kommandozeile direkt ein Working Directory, was bei Deinen Startparameter komplett fehlt - vom aktuellen Usercontext ganz abgesehen.

[Tutorial] Vertrackte Fehler durch Vergleich von echtem Projekt mit minimalem Testprojekt finden
Bitte teste das Verhalten mit einem vergleichbaren Aufruf.

Alles andere ist aktuell Glaskugelraten.

S
suedsee Themenstarter:in
5 Beiträge seit 2019
vor 4 Jahren

Hallo zusammen,

danke für eure Kommentare und Tipps.

Zunächst einmal die gute Nachricht: Das Problem hat sich erledigt.

Es trat nur genau an dem einen Tag auf, an dem ich es gepostet habe. Am nächsten Tag war die Laufzeit auch aus C# heraus wieder identisch mit dem der Kommandozeile. Also offenbar hat der PC-Neustart dies bewirkt. Man kann jetzt wohl nur noch Vermutungen aufstellen. Vielleicht hing etwas im Speicher (wobei zumindest laut Taskmanager noch reichlich frei war). Vielleicht war irgend etwas mit dem VS 2017, vielleicht irgend etwas mit dem Debugger, vielleicht vielleicht vielleicht ...

Ein gewisses ungutes Gefühl in der Magengrube bleibt allerdings ... Das Problem habe ich seitdem täglich getestet und ist nicht wieder aufgetreten.

Gruß
suedsee

656 Beiträge seit 2008
vor 4 Jahren

Ich hatte mal ein ähnliches Problem, was sich auch am nächsten Tag oder so von selbst gelöst hatte - Grund war dort ein .NET Update (oder wars eine Visual Studio Installation? Bin mir nicht mehr ganz sicher).
Auf jeden Fall war zu dem Zeitpunkt NGen noch nicht gelaufen, was die Startzeit maßgeblich beinflußt hatte - zwar nicht im Bereich einer halben Minute; aber an der Stelle doch merklich weil wir beim Process.Start mit sehr knappen Timeouts und Retries gearbeitet hatten die dann auf einmal permanent am triggern waren.