2016-07-27 20 views
0

Ich habe ein großes Problem hier und kann es nicht beheben. Ich arbeite an einer Update-Software bei der Arbeit, die auch auf einem Computer mit laufenden Prozessen arbeiten muss. Wenn also eine Kopie oder eine andere Behandlung Ausnahmen verursacht, muss ich den Prozess, der den Fehler verursacht hat, abbrechen und es erneut versuchen und die Aktualisierung fortsetzen. Das Problem ist, dass ich diese Prozesse abbringe, aber Fenster sagen mir weiterhin, dass einige Prozesse geöffnet sind, selbst wenn ich sie getötet habe.Wie vermeide ich IOException nach dem Töten von Prozessen?

So habe ich eine Methode, die Dateien des Updates auf einem Computer kopieren, auf dem Prozesse ausgeführt werden. Ich habe Process.GetProcessesByName ("processName") und Lösung unten verwendet, um Prozesse zu beenden.

Using C#, how does one figure out what process locked a file?

Dies ist mein Code:

try 
{ 
    file.CopyTo(destAbsolutePath, true); 
} 
catch (IOException ioException) 
{ 
    foreach (var process in Process.GetProcessesByName(file.Name.Replace(Path.GetExtension(file.Name), ""))) 
    { 
     process.Kill(); 
    } 
    foreach (Process p in Win32Processes.GetProcessesLockingFile(file.FullName)) 
    { 
     p.Kill(); 
    } 
    file.CopyTo(destAbsolutePath, true); 
} 

ich mich fragen, ob Windows-Zeit benötigen, wenn ein Prozess abgebrochen wird wissen. Ich habe versucht, ein wenig zu warten, aber nichts passiert. Wenn ich meine Anwendung schließe, nachdem diese Prozesse beendet und neu geöffnet wurden, gibt es keinen Fehler mehr. Wenn ich meine Anwendung mit GetCurrentProcess.Kill() kille, bleibt der Fehler dort. Ich glaube nicht, dass es meine Anwendung ist, die die IOException verursacht, weil ich nur das FileInfo-Objekt durchlaufen habe.

habe ich versucht, diese Lösung zu prüfen, ob meine Datei (eine DLL benutzerdefinierte Datei durch Prozesse verwendete ich getötet), die Prozesse gesperrt wurde nach der Tötung, die meine DLL-Datei verwenden und es gesperrt Wan't:

Is there a way to check if a file is in use?

Bitte, hilf mir. Danke

Antwort

0

Sie haben eine Race Condition, denke ich. Die Kill-Methode wird asynchron beendet. Rufen Sie die WaitForExit-Methode auf, um darauf zu warten, dass sie beendet wird, bevor Sie fortfahren. Wenn diese Prozesse eine Benutzeroberfläche haben, können Sie auch die CloseMainWindow-Methode in Erwägung ziehen, es ist eine "geordnetere" Möglichkeit, das Programm zu schließen (aber der Aufruf könnte fehlschlagen - zB könnte sich das Programm weigern, zu schließen) Anruf erfolgreich).

+0

Ich habe versucht, WaitForExit() aufzurufen, aber das Problem bleibt dort. Schließlich, selbst wenn ich meine Anwendung töte und sie wieder öffne, habe ich den Fehler. –

+0

Oh, und ich habe 2-3 Minuten nach dem letzten Fehler versucht, mein Programm neu zu starten und ... kein Fehler mehr ... Was sollte das Problem sein? –

+0

Ok Ich habe das Problem gefunden, aber ich brauche jemanden, der mir hilft, es zu lösen. Bei meiner Arbeit gibt es Simulatoren, die aus mehreren Computern bestehen. Ich muss Prozesse auf allen Computern beenden. So, wie man alle Computerprozesse auflistet, wenn ich weiß, dass die Computer angesteckt werden und zusammenarbeiten? –

0

Ok Ich habe das Problem gefunden, aber ich brauche jemanden, der mir hilft, es zu lösen. Bei meiner Arbeit gibt es Simulatoren, die aus mehreren Computern bestehen. Ich muss Prozesse auf allen Computern beenden. So, wie man alle Computerprozesse auflistet, wenn ich weiß, dass die Computer angesteckt werden und zusammenarbeiten?

Dies bedeutet, dass auf eine Dateifreigabe zugegriffen wurde und die Datei geöffnet blieb. File Shares Dateihandles gehören dem Kernel. Sie können sie überhaupt nicht schließen. Die Prozessfindungslogik funktioniert hier nicht.

Sie müssen sicherstellen, dass die Clients der Dateifreigabe nicht mehr auf die Freigabe zugreifen. Alternativ können Sie die Freigabe entfernen oder alle aktuell verbundenen Clients kicken. Ich denke, das Entfernen der Aktie ist die beste Option, weil es frei von Wettkämpfen ist und es nicht darauf angewiesen ist, etwas zu töten.

Also, wie alle Computer Prozesse auflisten, wenn ich weiß, dass die Computer angeschlossen sind und zusammenarbeiten?

Das ist eine andere Frage. Dies sollte bereits im Internet dokumentiert werden.