2010-01-15 45 views

Trả lời

9

Application.Restart() là phương pháp của bạn :)

Here là một câu trả lời StackOverflow mà chỉ ra một vài "xem-out-cho của" với việc sử dụng phương pháp này.

0

Tôi gặp sự cố tương tự, nhưng có liên quan đến rò rỉ bộ nhớ không thể quản lý mà tôi không thể tìm thấy trên ứng dụng phải chạy 24/7. Với khách hàng, tôi đồng ý rằng thời gian an toàn để khởi động lại ứng dụng là 03:00 AM nếu mức tiêu thụ bộ nhớ vượt quá giá trị được xác định.

Tôi đã thử Application.Restart, nhưng vì dường như nó sử dụng một số cơ chế bắt đầu phiên bản mới trong khi nó đang chạy, tôi đã đi cho một sơ đồ khác. Tôi đã sử dụng thủ thuật mà hệ thống tập tin xử lý tồn tại cho đến khi quá trình tạo ra chúng chết. Vì vậy, từ ứng dụng, tôi đã bỏ tập tin vào đĩa, và không Dispose() xử lý. Tôi đã sử dụng tệp để gửi thư mục thực thi 'bản thân' và thư mục bắt đầu cũng (để thêm tính linh hoạt).

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() ở cuối sẽ khởi ứng dụng tắt máy, và xử lý tập tin tôi sử dụng cho StreamWriter đây sẽ được tổ chức mở cho đến khi quá trình thực sự chết. Sau đó ...

Restarter.exe sẽ hoạt động. Nó TRIES để đọc các tập tin trong chế độ độc quyền, ngăn chặn nó để đạt được quyền truy cập cho đến khi ứng dụng chính không chết, sau đó bắt đầu ứng dụng chính, xóa các tập tin và tồn tại. Tôi đoán rằng nó không thể đơn giản hơn:

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); 
    } 
} 
Các vấn đề liên quan