Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 仅当从数据库打开图像时出现NullReferenceException_C#_Nullreferenceexception_Process.start_Waitforexit - Fatal编程技术网

C# 仅当从数据库打开图像时出现NullReferenceException

C# 仅当从数据库打开图像时出现NullReferenceException,c#,nullreferenceexception,process.start,waitforexit,C#,Nullreferenceexception,Process.start,Waitforexit,我的数据库中有一个存储各种文件的表 文件名显示在列表视图中,当用户点击其中一个文件名时,它将由注册的应用程序根据文件扩展名打开 代码如下: if (listViewArchivos.HasItems) { dynamic result = listViewArchivos.SelectedItem; var nombre = Path.GetTempPath() + admin.buscarNombreArchivo((int)result.Id); var bytes

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

文件名显示在列表视图中,当用户点击其中一个文件名时,它将由注册的应用程序根据文件扩展名打开

代码如下:

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等都可以正常工作。但是当我尝试打开图像时,Windows照片查看器(Windows 7)成功打开了该文件,但引发了NullReferenceException

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

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

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

看起来问题出在WPV上

你知道怎么回事吗

短暂性脑缺血发作

编辑:

异常被抛出

p.WaitForExit();

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

根据此MSDN:

…当进程已在运行时,您将无法返回
进程
对象

我在一个有关WindowsPhotoViewer性质的论坛上发现了以下内容:

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

因此,由于
explorer.exe
已在运行,因此您不会返回
进程
对象,因为它已在运行


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

您是否了解有关
NullReferenceException
的更多信息?什么是空的…是哪行代码抛出的?@DonBoitnott谢谢。错过了。调用WaitForExit时引发异常。您似乎没有从
Start()
返回有效的
p
。对吗?@DonBoitnott当我调试代码时,我可以看到调用WaitForExit时p为null。@DonBoitnott我认为你是对的。我怎样才能强制返回有效的p?谢谢你的帮助。无论如何,我必须找到另一种方法,因为现在我看到应用程序在关闭打开的进程之前不会响应。