2010-01-15 21 views

cevap

9

Application.Restart() yönteminiz :)

Here bu yöntemi kullanarak "seyretmek-out-for yönettiği" birkaç işaret başka bir StackOverflow cevaptır olduğunu.

0

Benzer bir sorunla karşılaştım, ancak benimki 7/24 çalıştırması gereken bir uygulamada bulamadığım yönetilemeyen bellek sızıntısı ile ilgiliydi. Müşteri ile, hafıza tüketiminin belirlenen değerin üzerine çıkması durumunda uygulamayı yeniden başlatmak için güvenli zamanın 03:00 olduğunu kabul ettim.

Application.Restart'u denedim, ancak zaten çalışıyorken yeni örneği başlatan bir mekanizma kullandığımız için başka bir şemaya gittim. Dosya sistemi işleyicilerinin, onları oluşturan süreç sona erinceye kadar devam ettiğini anladım. Yani, Uygulamadan, dosyayı diske bıraktım ve Dispose() tutamadı. Dosyayı 'kendim' çalıştırılabilir ve dizinini de (esneklik eklemek için) göndermek için kullandım.

Kodu:

_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() sonunda uygulama kapatma başlatmak olacağını ve dosya tanıtıcısı ben süreci gerçekten ölünceye kadar açık tutulacağını burada StreamWriter için kullandı. Sonra ...

Restarter.exe devreye giriyor. Dosyayı özel modda okumayı, ana uygulamanın ölmedikçe erişmesini engellemek için TRIES, ardından ana uygulamayı başlatır, dosyayı siler ve var olur. Sanırım daha basit olamaz:

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); 
    } 
} 
İlgili konular