【发布时间】:2015-03-24 12:22:06
【问题描述】:
在我们的 C# WPF 应用程序中,我们为添加到 WebDAV 文件存储的文件提供了一些文件查看器(PDF 查看器、图像查看器等)。当文件具有扩展名时,我们无法使用我们的 FileViewer 之一打开它并且它也不是潜在的有害文件(如 .exe 或 .bat),我们使用 Process.Start 打开它们。
下面是代码:
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 已经关闭。
那么,只要Process.Start 尚未完成,我如何才能让using 保持打开状态。另请记住,Process.Start 可能会在文件已被使用或我们无权打开它或类似的情况下失败。在这些情况下,使用最终还是应该关闭。
我知道我可以只添加一个小的Thread.Sleep,但这对于这类问题总是一个丑陋和错误的解决方案。
我也听说过EnableRaisingEvents 用于Process,但我真的不知道如何实现此功能以在适当的时候关闭using,而不会在出现问题时保持打开状态打开文件时。我也不能添加while(processNotStartedYet),因为当Process.Start“运行”时,用户应该仍然可以使用应用程序(大部分时间这只需要毫秒,但我们不想卡住过一会儿,以防出现问题)。
【问题讨论】:
标签: c# wpf process using process.start