在之前的问题中,我得到了一个非常棒的解决方案来解决我遇到的内存泄漏问题。但有一个问题——解决方案涉及到在事件处理程序中处理不必要的数据,该事件处理程序似乎在其最后一次迭代完成之前被调用。每次从我的摄像头中提取一个新帧时,它都会调用这个事件处理程序。
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 % 28 ehinvalidoperation.winforms.illegalcrossthreadcall % 29; k % 28 targetframeworkmoniker -.NETFramework,版本% 3 dv4.5 % 29; k % 28 devlang-csharp % 29, rd = true
http://msdn.microsoft.com/en-us/library/8843a9ch.aspx 我很抱歉在这么短的时间内连续问了两个问题,也很抱歉他们是在同一个话题上。我只是担心如果没有正确的方向,我可能会像离开水的鱼一样在谷歌上挣扎一段时间,看错了地方。所以我的问题是:你认为什么方法最适合避免这个错误?如果你碰巧知道文档、示例代码或教程可以帮助我解决这个问题,那也太棒了。
谢谢!
如果您仍在使用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;
}
您还可以将逻辑拆分为另一个方法,然后调用该方法或不调用该方法取决于是否需要调用。