1

在上一个问题中,我得到了一个很棒的解决方案来解决我遇到的内存泄漏问题。但是有一个问题 - 解决方案涉及在事件处理程序中处理不必要的数据,该事件处理程序似乎在其最后一次迭代完成之前被调用。每次从我的网络摄像头中拉出一个新帧时,它都会调用此事件处理程序。

    private void Handle_New_Frame(object sender, NewFrameEventArgs eventArgs)
    {
        //textBox1.Text = "Frame #: " + counter;
        //counter++;

        //bitmap = (Bitmap)eventArgs.Frame.Clone();
        if (bitmap != null)
            bitmap.Dispose();
        bitmap = new Bitmap(eventArgs.Frame);

        //bitmap = AForge.Imaging.Image.Clone(eventArgs.Frame);


        if (videoPictureBox1.Image != null)
            videoPictureBox1.Dispose(); //THE CRASH HAPPENS HERE. 
        videoPictureBox1.Image = bitmap;
    }

错误是:跨线程操作无效:控件“videoPictureBox1”从创建它的线程以外的线程访问。

我的问题是我一点也不熟悉 C# 线程,而且一般来说,我对线程并不熟悉。我在 StackOverflow 上发现了类似的问题,但没有一个我能够提取与我自己的问题相关的足够信息来让我走上正确的轨道(或者我可能看对了答案并错过了它!)

我在下面的链接中找到了两个 MSDN 答案,但我仍然很难掌握哪种解决方案最适合我的问题。

http://msdn.microsoft.com/query/dev11.query?appId=Dev11IDEF1&l=EN-US&k=k%28EHInvalidOperation.WinForms.IllegalCrossThreadCall%29;k%28TargetFrameworkMoniker-.NETFramework,Version%3Dv4.5%29;k %28DevLang-csharp%29&rd=true

http://msdn.microsoft.com/en-us/library/8843a9ch.aspx

我很抱歉在这么短的时间内连续问了两个问题,也为他们在同一个话题上道歉。我只是害怕如果没有朝正确的方向轻推,我可能会像谷歌上的一条鱼一样在谷歌上晃来晃去,看着错误的地方。

所以我的问题是:您认为哪种方法最适合避免此错误?如果你碰巧知道可以帮助我解决这个问题的文档、示例代码或教程,那也太棒了。

谢谢!

4

1 回答 1

1

如果您仍在使用它,则不应丢弃您的 videopicturebox。您应该只处置不再需要的资源。

你的代码应该是这样的

private void Handle_New_Frame(object sender, NewFrameEventArgs eventArgs)
{
    var newBitmap = new Bitmap(eventArgs.Frame);
    //This assumes the picture box descends from Control
    if(videoPictureBox1.InvokeRequired)        
    {
        Action action = () => videoPictureBox1.Image = newBitmap;
        //Invoke to make the action happen on the GUI thread
        videoPictureBox1.Invoke(action);
    }
    else
        videoPictureBox1.Image = newBitmap;    
    //Dispose the old bitmap now that it is not assigned to the picturebox anymore   
    if (bitmap != null)
        bitmap.Dispose();
    bitmap = newBitmap;
}

您还可以将逻辑拆分为另一个方法,然后根据是否需要调用来调用该方法。

于 2013-04-15T16:29:00.963 回答