在我们的C#WPF应用程序中,我们为我们添加到WebDAV文件存储中的文件提供了一些FileViewers(PDF查看器,图像查看器等)。当文件有扩展名时,我们无法使用其中一个FileViewers打开它也不是一个潜在的有害文件(如.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
已经关闭。
那么,只要using
尚未完成,我怎样才能保持Process.Start
开放。另请注意,当文件已被使用或我们无权打开文件或类似文件时,Process.Start
可能会失败。在这些情况下,使用仍应最终关闭。
我知道我可以添加一个小Thread.Sleep
,但对于这类问题,这总是一个丑陋而错误的解决方案。
我也听说过EnableRaisingEvents
的{{1}},但我真的不知道如何在适当的时候实现这个以关闭Process
,而不是如果打开文件时出现问题,请保持打开状态。我也无法添加using
,因为在while(processNotStartedYet)
“正在运行”时用户仍然可以使用该应用程序(大多数情况下这只需要ms,但我们不会如果出现问题,我想暂时陷入困境。)
答案 0 :(得分:0)
在Process.Start
之后使用Process.WaitForInputIdle(),等待进程进入空闲状态。
Process fileViewerProc = Process.Start(file);
fileViewerProc.WaitForInputIdle();