В нашем 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
«работает» (большую часть времени это занимает только мс, но мы не хотим застрять в то время как что-то пошло не так).