2014-10-24 2 views
3

У меня есть программа WPF, которая открывает документ Word в процессе и ждет завершения процесса перед продолжением. Если я оставлю Word открытым в течение нескольких часов, моя программа выйдет из строя.Process.Start приводит к сбою моей программы WPF

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

Я попробовал 2 способа сделать это, и у обоих проблемы одинаковые.

Way # 1

public void ShowExternalReference(string externalRef, bool waitForCompletion) 
{ 
    if (!string.IsNullOrEmpty(externalRef)) 
    { 
     using (var p = Process.Start(@externalRef)) 
     { 
      if (waitForCompletion) 
      { 
       // Wait for the window to finish loading. 
       p.WaitForInputIdle(); 

       // Wait for the process to end. 
       p.WaitForExit(); 
      } 
     } 
    } 
} 

Way # 2

public void ShowExternalReference(string externalRef, bool waitForCompletion) 
{ 
    if (!string.IsNullOrEmpty(externalRef)) 
    { 
     using (var p = Process.Start(@externalRef)) 
     { 
      if (waitForCompletion) 
      { 
       while (!p.HasExited) 
       { 
        Thread.Sleep(1000); 
       } 
      } 
     } 
    } 
} 

Любые идеи?

+2

В какой теме вы это называете? Вы не блокируете поток диспетчера WPF, не так ли? –

+0

Невозможно воспроизвести. Кроме того, это ненадежно, если пользователь открывает другие документы Word, процесс _ не выходит_, пока все документы не будут закрыты. Вы считаете [размещение Word Viewer в WPF] (https://code.msdn.microsoft.com/office/CSVSTOViewWordInWPF-db347436) [или анализ содержимого слова и показ в WPF] (http://www.codeproject.com/Статьи/649064/Show-Word-файл-в-WPF)? – kennyzx

+0

Как вы упомянули, память постоянно увеличивается, поэтому это, безусловно, похоже на случай утечки памяти и сбоя из-за чего-то вроде OOM, проверьте один из моих ответов, связанных с отладкой OOM: http://stackoverflow.com/questions/25875091/in-i-use-socket-io-why-i-got-an-error-an-unhandled-exception-of-type-system/26042456 # 26042456 –

ответ

1

Я читал комментарии и, похоже, проблема памяти с WaitForExit() в течение длительного времени.

Так что я хотел бы сделать что-то вроде этого:

  1. процесс запуска и получить только его PID
  2. Регулярно проверяйте, если процесс все еще активен

Возможно, это не будет производить тот же вопрос памяти ,

Мое предложение:

/// <summary> 
/// Interaction logic for MainWindow.xaml 
/// </summary> 
public partial class MainWindow : Window 
{ 

    private System.Threading.Timer _timer; 

    public MainWindow() 
    { 
     InitializeComponent(); 

     this.Content = new TextBlock() { Text = "Close notepad.exe when you want..." }; 

     // - Launch process 
     Process p = Process.Start("notepad.exe"); 
     int processId = p.Id; 
     _timer = new System.Threading.Timer(new System.Threading.TimerCallback(o => CheckPID((int)o)), processId, 0, 1000); 
    } 

    /// <summary> 
    /// Check if Process has exited 
    /// </summary> 
    /// <remarks>This code is NOT in UI Thread</remarks> 
    /// <param name="processId">Process unique ID</param> 
    private void CheckPID(int processId) 
    { 
     bool stillExists = false; 
     //Process p = Process.GetProcessById(processId); // - Raises an ArgumentException if process has alredy exited 
     Process p = Process.GetProcesses().FirstOrDefault(ps => ps.Id == processId); 
     if (p != null) 
     { 
      if (!p.HasExited) 
       stillExists = true; 
     } 

     // - If process has exited, do remaining work and stop timer 
     if (!stillExists) 
     { 
      _timer.Dispose(); 

      // - Ask UI thread to execute the final method 
      Dispatcher.BeginInvoke(new Action(ExternalProcessEnd), null); 
     } 
    } 


    /// <summary> 
    /// The external process is terminated 
    /// </summary> 
    /// <remarks>Executed in UI Thread</remarks> 
    private void ExternalProcessEnd() 
    { 
     MessageBox.Show("Process has ended"); 
    } 

} 

Недостаток заключается в том, что мы не сможем получить StandardOutput, StandardError и статус_завершения.

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