程序不会关闭,aforge相机继续运行,引发故障

use*_*326 7 c# multithreading aforge

我有一个奇怪的问题,我发现难以调试有时我无法关闭我的程序,它冻结当我尝试关闭它我做了一个大程序的视频图像识别,它工作我做了一个特殊的按钮关闭相机这按钮通过调用下面的函数来解决这个问题,确实,它确实有效.

 private void exitcamera()
 { 
 FinalVideo.SignalToStop();
 FinalVideo.WaitForStop();
 FinalVideo = null;
 }
Run Code Online (Sandbox Code Playgroud)

请注意,原始视频是这样开始的

 private void buttonStartCamera_Click(object sender, EventArgs e) 
 {
 FinalVideo = new VideoCaptureDevice(VideoCaptureDevices[comboBox1.SelectedIndex].MonikerString);
 FinalVideo.DesiredFrameSize = new System.Drawing.Size(640, 480);
 FinalVideo.DesiredFrameRate = 90;
 FinalVideo.NewFrame += new NewFrameEventHandler(FinalVideo_NewFrame);
 FinalVideo.ProvideSnapshots = true;  //snapshots
 FinalVideo.Start(); 
 }
Run Code Online (Sandbox Code Playgroud)

现在我的问题接缝了(这是一个猜测,因为我无法调试这一刻)一些线程仍然活跃,想要用数据更新主窗体.但是,由于那个正在关闭,它可能无法这样做.我觉得这样的事情正在发生,所以我在主申请表上写了

    private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
    {
     // Thread.Sleep(1000); // not sure about these delays might help syncing threads
     ExitCamera();
     Thread.Sleep(1000);
    }
Run Code Online (Sandbox Code Playgroud)

然而,随着最后的代码到位,程序退出更加困难?

我想发送子线程一个退出,但我不知道他们的名字(如果他们有一个名字),我不知道如何列出他们或指示他们停止他们在另一个DLL而不是我的代码部分.从一些dll我没有代码.

那么有没有办法列出子线程然后一个接一个地关闭它们,如果有人按下右上角以退出应用程序?

use*_*326 11

好吧,我设法调试程序,最后找到导致问题的原因.这有点奇怪,因为作为一个按钮我可以使用exitcamera功能停止相机.

但是,在_formclosing事件中,同样的例程没有工作虽然它在我标记了waitforstop函数之后工作了.

 private void exitcamera()
 { 
  FinalVideo.SignalToStop();
  // FinalVideo.WaitForStop();  << marking out that one solved it
  FinalVideo.NewFrame -= new NewFrameEventHandler(FinalVideo_NewFrame); // as sugested
  FinalVideo = null;
 } 
Run Code Online (Sandbox Code Playgroud)

我仍然有点困惑,为什么这不会工作,万一结束事件.但它的接缝要由此解决.