我有一个VideoObject
类使用 C++ DLL 从网络摄像头捕获图像和视频。我被告知 DLL 使用 DirectShow 来执行此操作。它似乎也启动了几个我无法控制的自己的线程。
该VideoObject
课程本身似乎运行良好。我可以捕捉图像和视频。但是,它的使用会对主 UI 的性能产生负面影响:它变得非常滞后。
如果我VideoObject
像这样实例化我的
public partial class ParentForm : Form
private VideoObject videoObject;
public ParentForm()
{
videoObject = new VideoObject();
}
}
然后用户界面变得非常滞后。我的猜测是,无论VideoObject
底层 DLL 在做什么,它都会影响我的应用程序的 UI 线程。
VideoObject
现在,我可以通过在它自己的 MTA 线程中启动实例来缓解这种滞后。(我对 C# 完全陌生,所以我猜以下可能不是很聪明。)
public partial class ParentForm : Form
private VideoObject videoObject;
private Thread videoObjectThread;
public ParentForm()
{
videoObjectThread = new Thread(new ThreadStart(() => videoObject = new VideoObject()));
videoObjectThread.SetApartmentState(ApartmentState.MTA);
videoObjectThread.Start();
}
}
我现在可以与videoObject
实例交互,并且 UI 不会滞后,但前提是我不再在 Form 的构造函数中进一步引用该实例。
如果我以任何方式在 Form 的构造函数中与这个线程实例交互,UI 将再次变得迟钝。就好像与VideoObject
我的表单构造函数中的实例的任何直接交互都会导致 UI 的滞后行为。
有人对我所看到的行为有任何见解吗?
编辑:我可能应该澄清“迟钝”的意思。我的意思是主面板的用户界面变得永远滞后和缓慢。没有其他任何影响;VideoObject 上的所有操作都按预期工作,不会以任何方式运行缓慢或延迟。
如果我不“触摸”表单构造函数中的 VideoObject,则 UI 可以完美运行。随后调用 VideoObject 的方法也不会导致 UI 运行缓慢。
这一切似乎都取决于我是否在主窗体的构造函数中访问 VideoObject。