【问题标题】:using TempFileCollection closes before Process.Start finished opening在 Process.Start 完成打开之前使用 TempFileCollection 关闭
【发布时间】:2015-03-24 12:22:06
【问题描述】:

在我们的 C# WPF 应用程序中,我们为添加到 WebDAV 文件存储的文件提供了一些文件查看器(PDF 查看器、图像查看器等)。当文件具有扩展名时,我们无法使用我们的 FileViewer 之一打开它并且它也不是潜在的有害文件(如 .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 已经关闭。

那么,只要Process.Start 尚未完成,我如何才能让using 保持打开状态。另请记住,Process.Start 可能会在文件已被使用或我们无权打开它或类似的情况下失败。在这些情况下,使用最终还是应该关闭。

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

我也听说过EnableRaisingEvents 用于Process,但我真的不知道如何实现此功能以在适当的时候关闭using,而不会在出现问题时保持打开状态打开文件时。我也不能添加while(processNotStartedYet),因为当Process.Start“运行”时,用户应该仍然可以使用应用程序(大部分时间这只需要毫秒,但我们不想卡住过一会儿,以防出现问题)。

【问题讨论】:

    标签: c# wpf process using process.start


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-27
      相关资源
      最近更新 更多