2015-03-24 2 views
0

В нашем C# WPF-приложении у нас есть некоторые FileViewers (PDF-viewer, Image-viewer и т. Д.) Для файлов, которые мы добавили в наш WebDAV fileStore. Когда файл имеет расширение, мы не можем открыть его с помощью одного из наших FileViewers, и он также не является потенциально опасным файлом (например, .exe или .bat), мы используем Process.Start, чтобы открыть их.с использованием TempFileCollection закрывается до завершения процесса. Начальное открытие

Вот код для этого:

public void OpenFileViewer() 
{ 
    if (OurFile == null || (String.IsNullOrWhiteSpace(OurFile.FilePath))) return; 

    try 
    { 
     if (File.Exists(OurFile.FilePath)) 
     { 
      // Local file not present in WebDAV yet 
      Open(OurFile.FilePath); 
      return; 
     } 

     using (var tempFiles = new TempFileCollection()) 
     { 
      var file = tempFiles.AddExtension(OurFile.FileExtension.Trim('.')); 
      using (var fs = File.OpenWrite(file)) 
      { 
       var content = _fileStore.LoadFile(OurFile.FilePath); 
       fs.Write(content, 0, content.Length); 
      } 

      Open(file); 
     } 
    } 
    catch (Exception e) 
    { 
     _windowManager.ShowWindow(new ExceptionViewModel(e)); 
    } 
} 

private void Open(string file) 
{ 
    if (!Path.HasExtension(file)) return; 

    var fileExtension = Path.GetExtension(file); 
    if (BlacklistExtensions.Contains(fileExtension)) return; 

    if (ViewerExtensions.Contains(fileExtension)) 
    { 
     _windowManager.ShowWindow(new FileViewModel(file)); 
    } 
    else 
    { 
     Process.Start(file); 
    } 
} 

Проблема, которая в настоящее время происходит: TempFileCollection using уже закрыт до Process.Start завершения. Если бы я отлаживал код, то Process.Start работает просто отлично, потому что TempFileCollection using еще не закрыт. Если я не отлаживаю его, однако, Process.Start не хватает времени, и using уже закрыт.

Итак, как я могу держать using открытым до тех пор, пока Process.Start еще не завершен. Также имейте в виду, чтоможет не работать, когда файл уже используется, или у нас нет разрешения на его открытие или что-то подобное. В этих случаях использование в конечном итоге должно быть закрыто.

Я знаю, что могу просто добавить небольшой Thread.Sleep, но это всегда уродливое и неправильное решение для таких проблем.

Я также слышал о EnableRaisingEvents для Process, но я не знаю, как я могу осуществить это, чтобы закрыть using в нужный момент, без него оставаться открытым, если что-то пошло не так при открытии файла. Я также не могу добавить while(processNotStartedYet), потому что пользователь все равно должен использовать приложение, пока Process.Start «работает» (большую часть времени это занимает только мс, но мы не хотим застрять в то время как что-то пошло не так).

ответ

0

Используйте Process.WaitForInputIdle() после Process.Start, который ждет, пока процесс перейдет в режим ожидания.

Process fileViewerProc = Process.Start(file); 
fileViewerProc.WaitForInputIdle(); 

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

  • Нет связанных вопросов^_^