2016-08-08 9 views
-3

Ich habe zwei Windows C# WinForms-Anwendungen, die die gleiche Weise in Bezug auf dieses Problem verhalten. Das Verhalten tritt auf, wenn die Anwendungen in dieser Reihenfolge ausgeführt werden: Hauptanwendung wird gestartet und ein Teil des normalen Arbeitsprozesses öffnet einige Sockets; Mischung aus TCP-UDP und Multicast. Wenn Sie eine Taste drücken, wird eine andere Anwendung gestartet, die C# -Prozessbibliotheken verwendet. Die zweite App startet ok und alles ist in Ordnung.C# windows (WinForms) untergeordnete Anwendung sperrt Sockets

Es ist bekannt und akzeptabel, dass, wenn ich eine zweite Instanz meiner Hauptanwendung starte, die zweite Instanz nicht in der Lage sein wird, die Sockets zu verwenden, die der erste besitzt. Das Problem, das ich habe, ist, dass, wenn ich die erste App herunterfahre und neu starte, es nicht in der Lage sein wird, die Sockets mehr zu bekommen ... bis die Kind-App auch heruntergefahren wird. Beachten Sie, dass die zweite App KEINE ANY-Sockets verwendet, aber irgendwie hält Windows die Sockets gesperrt, bis die zweite App heruntergefahren wird.

Ich habe diese Frage ZU PROGRAMMIER ZUSAMMENHANG MIT DEN IN C# WIN Formen, die JETZT MIT GROSSBUCHSTABEN FÜR MENSCHEN ZUM THEMA IST, DIE NICHT EIN/AUS-THEMA unterscheiden:

wie löse ich das so, dass ich don muss nicht die zweite App herunterfahren, damit der erste seine Sockets erwerben kann (WHICH -ich weiß - SIND FREI).

+1

Crystal Ball sagt, dass Sie ProcessStartInfo.UseShellExecute auf * false * festgelegt haben. Tu das nicht. –

+0

Kristallkugel? Welche Programmiersprache ist das? Ist es (MEHR) AUF DAS THEMA, anderen zu helfen, Antworten auf ihre Fragen zu finden? . Diese Frage und ihre Antwort mögen auch hilfreich für Leute sein, die .NET benutzen, aber nicht zu viel Erfahrung mit win32 haben. Es hat mir geholfen. –

Antwort

1

Dies ist normal handle inheritance Verhalten. Leider geht das .Net Process.Start als bInheritHandles an CreateProcess über (NB: eine offene Anfrage, um die Kontrolle über dieses Verhalten zu ermöglichen existiert: Make Process.Start have a option to change handle inheritance). Verwenden Sie als Arbeitsumgebung stattdessen die native CreateProcess, siehe When System.Diagnostics.Process creates a process, it inherits inheritable handles from the parent process.

+0

Danke Remus. Dies löst mein Problem, die externen Apps, die ich erstelle, zu verfolgen. –

+0

@GoguCelMare Ich denke, Sie sollten auch lesen http://StackOverflow.com/a/4657392/105929 es kann sein, was Sie brauchen. –

+0

Danke. Remus. Mein Problem war nur mit Sockets Besitz. Die Lösung, Prozesse mit Kernel32 CreateProcess mit einem falschen ererbsHandle zu erstellen, hat meine Probleme behoben. –