繁体   English   中英

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

[英]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 usingTempFileCollection 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM