[英]using TempFileCollection closes before Process.Start finished opening
在我们的C#WPF应用程序中,对于添加到WebDAV fileStore中的文件,我们有一些FileViewer(PDF查看器,Image-viewer等)。 当文件具有扩展名时,我们无法使用我们的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);
}
}
当前发生的问题:在Process.Start
完成之前,已经关闭了TempFileCollection using
。 如果我要调试代码,则Process.Start
可以正常工作,因为TempFileCollection using
的TempFileCollection using
尚未关闭。 但是,如果我没有调试通过,则Process.Start
没有足够的时间,并且using
已关闭。
因此,只要Process.Start
还没有完成,我如何才能保持using
状态开放。 还请记住,当文件已在使用中或我们无权打开它或类似的东西时, Process.Start
可能会失败。 在这种情况下,使用仍应最终关闭。
我知道我可以添加一个小的Thread.Sleep
,但这对于这些类型的问题始终是一个丑陋且错误的解决方案。
我也听说过有关Process
EnableRaisingEvents
的信息,但我真的不知道如何在适当的时候实施此操作以关闭using
,而如果打开文件时出现问题,则不要保持打开状态。 我也不能添加while(processNotStartedYet)
,因为当Process.Start
正在“运行”时,用户仍然应该能够使用该应用程序(大多数情况下,这只需要ms,但是我们不想卡住一会儿以防出现问题)。
在Process.Start
之后使用Process.WaitForInputIdle() ,它等待进程进入空闲状态。
Process fileViewerProc = Process.Start(file);
fileViewerProc.WaitForInputIdle();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.