【问题标题】:NullReferenceException only when opening images from database仅在从数据库打开图像时出现 NullReferenceException
【发布时间】:2013-06-21 13:00:41
【问题描述】:

我的数据库中有一个存储各种文件的表。

文件名显示在 ListView 中,当用户点击其中一个时,它会由注册的应用程序根据文件扩展名打开。

这是代码:

if (listViewArchivos.HasItems)
{
    dynamic result = listViewArchivos.SelectedItem;
    var nombre = Path.GetTempPath() + admin.buscarNombreArchivo((int)result.Id);
    var bytes = admin.buscarArchivo((int)result.Id);

    try
    {
        using (var writer = new BinaryWriter(File.Open(nombre, FileMode.Create)))
        {
            writer.Write(bytes);
        }

        var p = Process.Start(nombre);

        p.WaitForExit();
    }
    catch (Exception exc)
    {
        InterfazUtil.error(exc.Message); // This shows a MessageBox
    }
    finally
    {
        File.Delete(nombre);
    }
}

它适用于 docx、pdf、txt 等。但是当我尝试打开图像时,Window Photo Viewer (Windows 7) 成功打开了该文件,但抛出了 NullReferenceException。

如果我先关闭 WPV,然后再关闭 MessageBox,则该文件将从临时文件夹中删除。

如果我先关闭 MessageBox,则图像会从 WPV 中消失,并且在我关闭 WPV 后,该文件不会从临时文件夹中删除。

现在,如果我删除了 catch 块,那么 WPV 会成功打开该文件,并且在关闭它之后,该文件不会从临时文件夹中删除。显然应用程序崩溃是因为异常没有得到管理。

看起来问题是 WPV。

知道哪里出了问题吗?

TIA

编辑:

异常被抛出

p.WaitForExit();

【问题讨论】:

  • 您对NullReferenceException 了解更多吗?什么是 null...哪行代码在抛出它?
  • @DonBoitnott 谢谢。错过了。调用 WaitForExit 时抛出异常。
  • 您似乎没有从Start() 得到有效的p。对吗?
  • @DonBoitnott 当我调试代码时,我可以看到调用 WaitForExit 时 p 为空。
  • @DonBoitnott 我认为你是对的。如何强制返回有效的 p?

标签: c# nullreferenceexception process.start waitforexit


【解决方案1】:

当您首先关闭 MessageBox 时,临时文件不会被删除,因为 WPV 使用它并且不允许它。

【讨论】:

    【解决方案2】:

    根据这个 MSDN:http://msdn.microsoft.com/en-us/library/53ezey2s.aspx

    ...当进程已在运行时,您将不会取回 Process 对象。

    我在与 WindowsPhotoViewer 的性质有关的论坛上发现了这个:

    实际上,Windows 照片查看器是 Windows 资源管理器的一部分,并且 一般运行在 Explorer.exe 进程中。其实你是什么 调用照片查看器实际上只是图像的“预览”动词。 它不是一个独立的应用程序,并且在没有图像的情况下打开它或 图片没有任何意义。

    因此,您不会返回 Process 对象,因为 它已经在运行,因为 explorer.exe 已经在运行。

    最后,我认为这意味着如果您的图像在 WindowsPhotoViewer 中打开,您将无法使WaitForExit() 工作,因为所有者进程永远不会退出。

    【讨论】:

    • 感谢您的帮助。无论如何,我必须找到另一种方法,因为现在我看到应用程序在我关闭打开的进程之前没有响应。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-17
    • 1970-01-01
    • 2018-07-07
    • 2023-04-06
    • 1970-01-01
    • 2013-03-22
    相关资源
    最近更新 更多