Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.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# BackgroundWorker断开连接上下文_C#_Wpf_Backgroundworker - Fatal编程技术网

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();
 }