**关于可能的重复 - BackgroundWorker 方法在这里不适用。
下面是我尝试使用 AForge 库从 IP 摄像机接收视频。
每个视频流应该在单独的线程中运行,当新帧到达时通知 UI 线程。事件处理程序在引发它的同一个线程中执行,因此我需要使用 Invoke。
一切顺利,直到我想停止应用程序。标有“>>>”的行会引发 ObjectDisposed 异常,因此我的应用程序不会像运行时那样顺利结束。
我知道问题在于理解多线程,因此看不到真正的问题。有人可以解释一下这里发生了什么吗?
Form1.cs
public void generic_NewFrame(object sender, NewFrameEventArgs e)
{
...
if (pictureBox1.InvokeRequired)
{
>>> pictureBox1.Invoke(new MethodInvoker(delegate()
{
pictureBox1.BackgroundImage = (Image)buf;
}));
}
else
{
pictureBox1.BackgroundImage = (Image)buf;
}
...
}
尽可能短,Camera 类:
Camera.cs
//Camera thread loop
private void WorkerThread()
{
while (!stopEvent.WaitOne(0, false))
{
...
if (!stopEvent.WaitOne(0, false))
{
// notify UI thread
OnNewFrame(new NewFrameEventArgs(Last_frame));
...
}
}
override public void Play()
{
stopEvent = new ManualResetEvent(false);
thread = new Thread(new ThreadStart(WorkerThread));
thread.Start();
}
override public void Stop()
{
if (thread != null)
{
stopEvent.Set();
}
}