C# 删除EventHandler不会显示任何效果
我想暂停Kinect的视频流。该按钮具有以下代码: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
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);