C# 使用TempFileCollection在进程之前关闭。开始完成打开

C# 使用TempFileCollection在进程之前关闭。开始完成打开,c#,wpf,process,using,process.start,C#,Wpf,Process,Using,Process.start,在我们的C#WPF应用程序中,我们为添加到WebDAV文件存储中的文件提供了一些文件查看器(PDF查看器、图像查看器等)。当文件具有扩展名时,我们无法使用其中一个文件查看器打开,并且它也不是潜在的有害文件(如.exe或.bat),我们使用进程。启动来打开它们 以下是此操作的代码: public void OpenFileViewer() { if (OurFile == null || (String.IsNullOrWhiteSpace(OurFile.FilePath))) retu

在我们的C#WPF应用程序中,我们为添加到WebDAV文件存储中的文件提供了一些文件查看器(PDF查看器、图像查看器等)。当文件具有扩展名时,我们无法使用其中一个文件查看器打开,并且它也不是潜在的有害文件(如.exe或.bat),我们使用
进程。启动
来打开它们

以下是此操作的代码:

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在
过程完成之前已关闭。开始
。如果我要调试代码,
进程.Start
工作得很好,因为使用
TempFileCollection尚未关闭。但是,如果我不进行调试,则
进程.Start
没有足够的时间,并且
using
已经关闭

那么,只要
进程.Start
尚未完成,我如何使用
保持
处于打开状态。还要记住,
进程.Start
可能会在文件已被使用或我们没有打开它的权限或类似权限时失败。在这些情况下,最终仍应关闭使用

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

我也听说过
过程启用
引发事件
,但我真的不知道如何在适当的时候使用
关闭
,而在打开文件时出错时不让它保持打开状态。我也不能添加
while(processNotStartedYet)
,因为当
Process.Start
正在“运行”时,用户应该仍然能够使用应用程序(大多数时间这只需要毫秒,但我们不希望在出现问题时陷入困境)。

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

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