У меня была аналогичная проблема, но моя была связана с неуправляемой утечкой памяти, которую я не мог найти в приложении, которое должно работать 24/7. С клиентом я согласился с тем, что безопасное время для перезапуска приложения было 3:00 утра, если потребление памяти превысило определенное значение.
Я пробовал Application.Restart
, но так как он использует какой-то механизм, который запускает новый экземпляр, пока он уже запущен, я пошел на другую схему. Я использовал трюк, который обрабатывает файловая система, до тех пор, пока не завершится процесс их создания. Итак, из приложения я сбросил файл на диск и не сделал Dispose()
дескриптор. Я использовал файл для отправки «сам» исполняемого файла и начала директории (чтобы добавить гибкость).
Код:
_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()
в конце будет инициировать приложение остановки, и дескриптор файла я использовал для StreamWriter
здесь будет проводиться открытым, пока процесс действительно не умирает. Затем ...
Restarter.exe вступает в действие. Он TRIES читает файл в эксклюзивном режиме, не позволяя ему получить доступ до тех пор, пока основное приложение не будет мертвым, затем запустит основное приложение, удалит файл и будет существовать. Я предполагаю, что это не может быть проще:
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);
}
}
Это звучит как слэм данк для мыши один раз, особенно если вы используете ссылку я отправил в ответ Флетчера, чтобы проверить, в то время как программа работает. Добавьте комментарий, если по какой-то причине clickonce не работает для вас. –