C# BackgroundWorker断开连接上下文
我有错误代码:C# BackgroundWorker断开连接上下文,c#,wpf,backgroundworker,C#,Wpf,Backgroundworker,我有错误代码: public static Emgu.CV.Capture _capture; public static DispatcherTimer _timer; 应用程序工作正常,但当我关闭应用程序时,会提示我:消息:Context0x23754b0“已断开连接…”如何解决此问题?我认为这与您的相机捕获库以及它可能如何使用非托管资源有关 首先,我会对RunWorkerCompleted中的所有代码进行注释,以查看消息是否仍然存在。如果没有,则是由一个或多个GetCaptureProp
public static Emgu.CV.Capture _capture;
public static DispatcherTimer _timer;
应用程序工作正常,但当我关闭应用程序时,会提示我:
消息:Context0x23754b0“已断开连接…”代码>如何解决此问题?我认为这与您的相机捕获库以及它可能如何使用非托管资源有关
首先,我会对RunWorkerCompleted
中的所有代码进行注释,以查看消息是否仍然存在。如果没有,则是由一个或多个GetCaptureProperty
调用引起的。我想不会的
我在Egmu.CV.Capture的示例中看到有一个Capture.DisposeObject()
方法讨论释放捕获的对象。我的猜测是,在实例化\u capture
并完成所需操作后,您必须进行清理。我建议在您的ProcessFrame
完成后(或在退出应用程序时),尝试调用\u capture.DisposeObject()
,以查看是否会进行清理并正常退出
编辑:
如果所有其他方法都失败了,我建议的方法是尽可能多地注释掉代码,以便在退出程序时不会引发异常。然后,在部分代码中添加注释,直到您能够准确地找到最终导致退出时异常的创建或运行内容。一旦您可以将其本地化,您将更好地了解如何修复它。我认为这与您的相机捕获库以及它如何潜在地使用非托管资源有关
首先,我会对RunWorkerCompleted
中的所有代码进行注释,以查看消息是否仍然存在。如果没有,则是由一个或多个GetCaptureProperty
调用引起的。我想不会的
我在Egmu.CV.Capture的示例中看到有一个Capture.DisposeObject()
方法讨论释放捕获的对象。我的猜测是,在实例化\u capture
并完成所需操作后,您必须进行清理。我建议在您的ProcessFrame
完成后(或在退出应用程序时),尝试调用\u capture.DisposeObject()
,以查看是否会进行清理并正常退出
编辑:
如果所有其他方法都失败了,我建议的方法是尽可能多地注释掉代码,以便在退出程序时不会引发异常。然后,在部分代码中添加注释,直到您能够准确地找到最终导致退出时异常的创建或运行内容。一旦你能将其本地化,你就会更好地了解如何修复它。这是一个与COM相关的错误,毫无疑问,这是因为你在后台线程上创建了捕获对象。COM对象具有线程亲缘关系,一旦创建它的线程停止运行,COM对象就死了,不能再使用。无论如何尝试使用它都会产生警告
这在RunWorkerCompleted事件处理程序中不会发生,这一点非常显著,必须以一种不明显的方式嵌入OpenCV或Emgu管道中。这当然不意味着有一天它不会发生。您需要重新考虑这一点,仅在worker上创建对象并让其他所有内容在UI线程上运行没有多大意义。对工人做任何事情,包括处理。这是一个与COM相关的错误,毫无疑问,这是因为您在后台线程上创建了捕获对象。COM对象具有线程亲缘关系,一旦创建它的线程停止运行,COM对象就死了,不能再使用。无论如何尝试使用它都会产生警告
这在RunWorkerCompleted事件处理程序中不会发生,这一点非常显著,必须以一种不明显的方式嵌入OpenCV或Emgu管道中。这当然不意味着有一天它不会发生。您需要重新考虑这一点,仅在worker上创建对象并让其他所有内容在UI线程上运行没有多大意义。对工人做任何事情,包括处理。或者一个也没有。我忘了清理方法。我会写信的question@rkmax,作为一个好的实践,我会按照与创建相反的顺序进行Dispose
,然后尝试显式的Capture.DisposeObject()
方法。哦,我会从这些字段中删除static
修饰符……实际上,这可能是问题所在。@rkmax,如果它们不必是static
的,那么就不要将它们设为static。我还编辑了我的答案,添加了一些建议。我对RunWorkerComplete
中的代码进行了注释,但仍然得到了与上一个技巧相同的错误,我对所有代码进行了注释,我所做的只是\u bw.DoWork+=(s,e)=>{u capture=new capture();}
,但问题仍然存在,我忘记了清理方法。我会写信的question@rkmax,作为一个好的实践,我会按照与创建相反的顺序进行Dispose
,然后尝试显式的Capture.DisposeObject()
方法。哦,我会从这些字段中删除static
修饰符……实际上,这可能是问题所在。@rkmax,如果它们不必是static
的,那么就不要将它们设为static。我还编辑了我的答案,并提出了其他建议。我对RunWorkerComplete
中的代码进行了注释,但仍然得到了与上一个技巧相同的错误,我对所有代码进行了注释,我所做的只是\u bw.DoWork+=(s,e)=>{u capture=new capture();}
,但问题仍然存在
_timer = new DispatcherTimer();
_timer.Interval = _settings.camera_interval;
_timer.Tick += ProcessFrame;
BacgroundWorker _bw = new BackgroundWorker
{
WorkerReportsProgress = true,
WorkerSupportsCancellation = true
};
_bw.DoWork += (s, e) =>
{
// Initialize the device in background
_capture = new Capture();
};
_bw.RunWorkerCompleted += (s, e) =>
{
_capture.SetCaptureProperty(CAP_PROP.CV_CAP_PROP_FRAME_HEIGHT,
_settings.camera_height);
_capture.SetCaptureProperty(CAP_PROP.CV_CAP_PROP_FRAME_WIDTH,
_settings.camera_width);
Brightness = _capture
.GetCaptureProperty(CAP_PROP.CV_CAP_PROP_BRIGHTNESS);
Contrast = _capture
.GetCaptureProperty(CAP_PROP.CV_CAP_PROP_CONTRAST);
// Get images from camera
_timer.Start();
};
_bw.RunWorkerAsync();
public override void CleanUp()
{
_timer.Stop();
_bw.Dispose();
if (_capture != null) _capture.Dispose();
}