NullReferenceException处理Video的结束事件

时间:2017-01-16 09:21:59

标签: c# directx

我正在制作一个C#Windows窗体应用程序,它使用DirectX托管代码在某个时刻播放视频。我希望应用程序在播放视频后立即退出,因此我尝试处理视频的结束事件并引发异常。 这是代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Microsoft.DirectX.DirectSound;
using Microsoft.DirectX.AudioVideoPlayback;
using Microsoft.DirectX;
using System.Diagnostics;

namespace Picture_Button
{
    public partial class Form1 : Form
    {
        Video video = new Video("C:\\Users\\Pushkin\\Desktop\\PPAP.mp4");
        //Video video = new Video("C:\\Users\\Pushkin\\Desktop\\PPAP.mp4");
        private int clicks = 0;
        public Form1()
        {
            InitializeComponent();
            pictureBox1.SizeMode = PictureBoxSizeMode.Zoom;
            video.Ending += new System.EventHandler(this.Video_Ending);
            //video.Ending += Video_Ending;
        }

        private void pictureBox1_Click(object sender, EventArgs e)
        {
            clicks++;
        }

        private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
        {
            switch (clicks)
            {
                case 0: pictureBox1.Image = Properties.Resources.Pineapple; break;
                case 1: pictureBox1.Image = Properties.Resources.Apple; break;
                case 2: pictureBox1.Image = Properties.Resources.Pen; break;
                case 3:
                    {
                        video.Owner = this;
                        video.Play();
                        /*video.Dispose();
                        Application.Exit();*/
                    }
                    break;
            }
        }
        private void Video_Ending(object sender, EventArgs e)
        {
            //throw new NotImplementedException();
            video.Dispose();
            Application.Exit();
        }
    }
}

例外:

System.NullReferenceException occurred
  HResult=-2147467261
  Message=Object reference not set to an instance of an object.
  Source=Microsoft.DirectX.AudioVideoPlayback
  StackTrace:
  at VideoWndProc(HWND__* hWnd, UInt32 uMsg, UInt32 wParam, Int32 lParam)
  InnerException: 

另外,我注意到程序运行完美,没有Ending事件的代码。

1 个答案:

答案 0 :(得分:1)

发生异常是因为Video组件在事件处理程序返回后仍尝试执行操作。因此,您无法在处理程序中处置该组件。

在处理程序中调用表单的Close方法。这将在处理程序返回后以及Video组件完成后关闭表单。

private void Video_Ending(object sender, EventArgs e)
{ 
    Close();
}

在这种情况下,处理视频组件是可选的,因为我们知道应用程序无论如何都会在关闭表单后终止。 (当进程退出时,将释放其所有资源)。

如果此表单是较大项目的一部分,那么处理Video组件是个好主意。正确的位置是表单的FormClose事件。