Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.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# 删除EventHandler不会显示任何效果_C#_Wpf_Event Handling_Video Streaming_Kinect - Fatal编程技术网

C# 删除EventHandler不会显示任何效果

C# 删除EventHandler不会显示任何效果,c#,wpf,event-handling,video-streaming,kinect,C#,Wpf,Event Handling,Video Streaming,Kinect,我想暂停Kinect的视频流。该按钮具有以下代码: if (capturing==0) { try { // Signing the Event for Image frame ready nuiRuntime.VideoFrameReady += new EventHandler<ImageFrameReadyEventArgs>(nuiRuntime_VideoFrameReady); nuiRuntime.Dept

我想暂停Kinect的视频流。该按钮具有以下代码:

if (capturing==0)
{
    try
    {
        // Signing the Event for Image frame ready
        nuiRuntime.VideoFrameReady += new EventHandler<ImageFrameReadyEventArgs>(nuiRuntime_VideoFrameReady);
        nuiRuntime.DepthFrameReady += new EventHandler<ImageFrameReadyEventArgs>(nuiRuntime_DepthFrameReady);
        nuiRuntime.VideoStream.Open(ImageStreamType.Video, 2, ImageResolution.Resolution640x480, ImageType.Color);
        nuiRuntime.DepthStream.Open(ImageStreamType.Depth, 2, ImageResolution.Resolution320x240, ImageType.Depth);
    }
    catch
    {
        Dialogs.ShowWarning("An Error occured. Check, if the Kinect is connected properly.");
    }
    finally
    {
        capturing = 2;
    }
}
else if (capturing == 1)
{
    nuiRuntime.VideoFrameReady += new EventHandler<ImageFrameReadyEventArgs>(nuiRuntime_VideoFrameReady);
    nuiRuntime.DepthFrameReady += new EventHandler<ImageFrameReadyEventArgs>(nuiRuntime_DepthFrameReady);
    capturing = 2;//go on after break 
}
else
{
    nuiRuntime.VideoFrameReady -= new EventHandler<ImageFrameReadyEventArgs>(nuiRuntime_VideoFrameReady);
    nuiRuntime.DepthFrameReady -= nuiRuntime_DepthFrameReady;
    capturing = 1;//pause
}
我不认为,这很难理解。 状态:0,Kinect未初始化,请执行此操作 1,Kinect暂停,继续 2、Kinect正常捕获

但是:当执行else时,GUI WPF.Image中的图像仍然显示一个移动的视频流。在另外两种情况下,我试着让它休息一下。然后应该会显示一张静止的图片

当然,我可以简单地说EventHandler:如果我们处于状态1,就不要处理图片,但我不认为这是一种干净的实现方式


有人能看到我的错误吗?

事件处理程序是引用类型委托,即添加到事件中的委托

nuiRuntime.VideoFrameReady += new EventHandler<ImageFrameReadyEventArgs>(nuiRuntime_VideoFrameReady);
顺便说一句,您在else块中使用的代码:

nuiRuntime.DepthFrameReady -= nuiRuntime_DepthFrameReady;
同:

nuiRuntime.DepthFrameReady -= new EventHandler<ImageFrameReadyEventArgs>(nuiRuntime_DepthFrameReady);

编译器简单地为您执行新的EventHandler操作。

这是错误的!当删除事件处理程序时,不是计算传递的委托,而是计算委托目标。实际上,是为了这样做而实现的。可能事实上,他有一些错误,但一般来说,如果我这样做的话,它是有效的。谢谢虽然这对普通的事件处理程序有效,但Kinect会在主线程上对事件进行预排队。有关更多详细信息,请参阅。
nuiRuntime.VideoFrameReady += handler;
nuiRuntime.VideoFrameReady -= handler;
nuiRuntime.DepthFrameReady -= nuiRuntime_DepthFrameReady;
nuiRuntime.DepthFrameReady -= new EventHandler<ImageFrameReadyEventArgs>(nuiRuntime_DepthFrameReady);