使用TempFileCollection在Process.Start完成打开之前关闭

时间:2015-03-24 12:22:07

标签: c# wpf process using process.start

在我们的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 usingProcess.Start完成之前已经关闭。如果我要调试代码,Process.Start工作正常,因为TempFileCollection using尚未关闭。但是,如果我不通过它进行调试,则Process.Start没有足够的时间且using已经关闭。

那么,只要using尚未完成,我怎样才能保持Process.Start开放。另请注意,当文件已被使用或我们无权打开文件或类似文件时,Process.Start可能会失败。在这些情况下,使用仍应最终关闭。

我知道我可以添加一个小Thread.Sleep,但对于这类问题,这总是一个丑陋而错误的解决方案。

我也听说过EnableRaisingEvents的{​​{1}},但我真的不知道如何在适当的时候实现这个以关闭Process,而不是如果打开文件时出现问题,请保持打开状态。我也无法添加using,因为在while(processNotStartedYet)“正在运行”时用户仍然可以使用该应用程序(大多数情况下这只需要ms,但我们不会如果出现问题,我想暂时陷入困境。)

1 个答案:

答案 0 :(得分:0)

Process.Start之后使用Process.WaitForInputIdle(),等待进程进入空闲状态。

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