Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

Stark unterschiedliches Zeitverhalten zwischen Aufruf von Kommandozeile und in C# mit Process.Start
suedsee
myCSharp.de - Member



Dabei seit:
Beiträge: 7

Themenstarter:

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

beantworten | zitieren | melden

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
Dieser Beitrag wurde 3 mal editiert, zum letzten Mal von suedsee am .

Moderationshinweis von Abt (07.06.2019 - 13:29:12):

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

private Nachricht | Beiträge des Benutzers
T-Virus
myCSharp.de - Member



Dabei seit:
Beiträge: 1768
Herkunft: Nordhausen, Nörten-Hardenberg

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
suedsee
myCSharp.de - Member



Dabei seit:
Beiträge: 7

Themenstarter:

beantworten | zitieren | melden

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.
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von suedsee am .
private Nachricht | Beiträge des Benutzers
T-Virus
myCSharp.de - Member



Dabei seit:
Beiträge: 1768
Herkunft: Nordhausen, Nörten-Hardenberg

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 15526
Herkunft: BW

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
suedsee
myCSharp.de - Member



Dabei seit:
Beiträge: 7

Themenstarter:

beantworten | zitieren | melden

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
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von suedsee am .
private Nachricht | Beiträge des Benutzers
BhaaL
myCSharp.de - Member

Avatar #erP6yAFiewXrJTqrvg6R.jpg


Dabei seit:
Beiträge: 648

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers