2009-06-30 3 views
3

У меня есть приложение, которое я перезапуск в 2 часа ночи каждое утро с помощьюкак перезапустить один экземпляр WinForms приложения

Application.Restart();

проблемы в том, что инспекции пара недель позже показывает, что существует 6 или, соответственно, экземпляры.

Я попытался ограничить количество экземпляров с помощью

bool IsOwned; 
Mutex m = new Mutex(true, Name, out IsOwned); 
if (!IsOwned) 
     Environment.Exit(0); 

Но это не сработало, как по какой-то причине в последнее время остановился экземпляр был еще виден ... или, по крайней мере, это моя интерпретация и как результате приложение не перезагрузилось.

Где я пошла не так?

ответ

3

Убедитесь, что вы нажмете на событие выхода приложения метод, который освобождает мьютекс и закрывает его.

2

Прежде всего ... зачем вам нужно перезагружать приложение каждый день?

Я предполагаю, что это лучшее решение, чем приложение, которое перезагружается в 2 часа ночи каждый день.

Например, у вас может быть утечка памяти ... как описано в вашем комментарии. Обращение к этому может быть лучшим местом для сосредоточения ваших усилий. Большинство программистов, включая меня, взломать перезапуск приложения, чтобы избежать утечки памяти.

+1

что это касается вопроса? Дело в том, что я хотел бы перезапустить каждый день в 2 часа ночи. – Brad

+0

Почему важно ... и у меня такое чувство, что первое, что задают многие люди. –

+2

@ Брэд - почему это важно, потому что (как и другие вопросы здесь, на SO) иногда основной вопрос можно решить сделать свой поверхностный выпуск спорное. Вопрос полностью законный, хотя я, вероятно, разместил его в комментариях, а не как фактический ответ. – AllenG

2

Я столкнулся с этой проблемой в прошлом, и, по-моему, проблема заключалась в том, что мьютекс исполняемого экземпляра, который запускает shutdown, не был выпущен до мьютекса второго экземпляра, запуск которого проверял его. Чтобы решить эту проблему, мне было предоставлено средство для возврата контроля в мою основную форму с указанием на перезапуск; так что части Shutdown Restart не пришлось выполнять какие-либо задачи, кроме выхода.

3

Возможно, вы используете несколько потоков? Если вы не закрываете фоновые потоки, они будут поддерживать ваш процесс даже при вызове Application.Restart.

Я вставлял в код ниже, который демонстрирует это поведение. Чтобы увидеть это, скомпилируйте тестовый проект с приведенным ниже кодом и запустите его. (вам нужно будет поместить 1 кнопку в форму и назначить обработчик кликов, который я определил в коде ниже).

Запустите диспетчер задач, перейдите на вкладку «Процесс» и обязательно добавьте столбец идентификатора (идентификатор процесса) в представление.

Каждый раз, когда вы нажимаете кнопку, приложение перезагружается, но вы должны увидеть, что старый процесс все еще висит в памяти (из-за фонового потока, который не был закрыт).

 

    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 
      // start a background thread that will never be exited. 
      System.Threading.Thread thread = new System.Threading.Thread(delegate() { while (true) System.Threading.Thread.Sleep(1000); }); 
      thread.Start(); 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      Application.Restart(); 
     } 
} 
 

Предполагая, что это ваша проблема, лучший способ исправить это поставить какой-то проверки в фоновых потоков (даже флаг BOOL будет делать). Попросите их периодически проверять и выходить изящно, когда ваше приложение отключается.

Примечание: вы можете установить для свойства фона потока значение true, и оно будет выведено автоматически, но если вы это сделаете, у вас нет контроля над тем, какая команда выполняет поток при ее выходе, t выполнить любой вид очистки. Лучше всего закодировать собственный чек.

Смежные вопросы