2010-01-15 7 views
9

Gibt es eine Möglichkeit, eine Windows-Anwendung in dot net mit dot net CodeNeustart Fenster App dot net

ich die Anwendung bedeuten geschrieben neu starten sollte sich beenden und neu starten, auf einen Klick

Antwort

9

Application.Restart() ist Ihre Methode :)

Here ist eine andere Antwort, die Stackoverflow ein paar „watch-out-für die“ weist darauf hin, mit dieser Methode.

0

Ich hatte ein ähnliches Problem, aber meins wurde mit nicht mehr handhabbaren Speicherverlust in Verbindung gebracht, die ich nicht in einer App finden konnte, die rund um die Uhr laufen muss. Mit dem Kunden habe ich zugestimmt, dass die sichere Zeit zum Neustart der App 03:00 Uhr ist, wenn der Speicherverbrauch über dem definierten Wert liegt.

Ich versuchte Application.Restart, aber da es scheint, einen Mechanismus zu verwenden, der neue Instanz startet, während es bereits ausgeführt wird, ging ich für ein anderes Schema. Ich habe den Trick verwendet, dass Dateisystemhandles bestehen bleiben, bis der Prozess, der sie erstellt hat, stirbt. Also, von der Anwendung, habe ich die Datei auf die Festplatte fallen gelassen, und nicht Dispose() das Handle. Ich benutzte die Datei, um "mich selbst" ausführbar zu senden und das Verzeichnis zu starten (um Flexibilität hinzuzufügen).

Code:

_restartInProgress = true; 
string dropFilename = Path.Combine(Application.StartupPath, "restart.dat"); 
StreamWriter sw = new StreamWriter(new FileStream(dropFilename, FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite)); 
sw.WriteLine(Application.ExecutablePath); 
sw.WriteLine(Application.StartupPath); 
sw.Flush(); 
Process.Start(new ProcessStartInfo 
{ 
    FileName = Path.Combine(Application.StartupPath, "VideoPhill.Restarter.exe"), 
    WorkingDirectory = Application.StartupPath, 
    Arguments = string.Format("\"{0}\"", dropFilename) 
}); 
Close(); 

Close() am Ende würde App Shutdown initiieren, und ich Datei-Handle verwendet für StreamWriter hier würde offen gehalten, bis Prozess wirklich stirbt. Dann ...

Restarter.exe kommt in Aktion. Es versucht, die Datei im exklusiven Modus zu lesen, verhindert, dass es Zugriff erhält, bis die Haupt-App nicht tot ist, startet dann die Haupt-App, löscht die Datei und existiert. Ich schätze, dass es nicht einfacher sein kann:

static void Main(string[] args) 
{ 
    string filename = args[0]; 
    DateTime start = DateTime.Now; 
    bool done = false; 
    while ((DateTime.Now - start).TotalSeconds < 30 && !done) 
    { 
     try 
     { 
      StreamReader sr = new StreamReader(new FileStream(filename, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite)); 
      string[] runData = new string[2]; 
      runData[0] = sr.ReadLine(); 
      runData[1] = sr.ReadLine(); 
      Thread.Sleep(1000); 
      Process.Start(new ProcessStartInfo { FileName = runData[0], WorkingDirectory = runData[1] }); 
      sr.Dispose(); 
      File.Delete(filename); 
      done = true; 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine(ex.Message); 
     } 
     Thread.Sleep(1000); 
    } 
} 
Verwandte Themen