我遇到了线程和处理资源的问题。处理其他线程拥有的ActiveX资源
我有一个C#Windows窗体应用程序,它在一个线程中运行昂贵的操作。该线程实例化一个ActiveX控件(AxControl)。这个控件必须处理,因为它使用了大量的内存。所以我实现了一个Dispose()方法,甚至是一个析构函数。
线程结束后调用析构函数。这令人遗憾地被UI线程调用。所以调用activexControl.Dispose();由于该对象属于另一个线程,因此失败,并显示消息“已与其基础RCW分离的COM对象”。
如何正确地做到这一点,或者它只是一个糟糕的设计,我使用?
(我剥代码降到最低,包括消除任何安全问题。)
class Program
{
[STAThread]
static void Main()
{
// do stuff here, e.g. open a form
new Thread(new ThreadStart(RunStuff);
// do more stuff
}
private void RunStuff()
{
DoStuff stuff = new DoStuff();
stuff.PerformStuff();
}
}
class DoStuff : IDisposable
{
private AxControl activexControl;
DoStuff()
{
activexControl = new AxControl();
activexControl.CreateControl(); // force instance
}
~DoStuff()
{
Dispose();
}
public void Dispose()
{
activexControl.Dispose();
}
public void PerformStuff()
{
// invent perpetuum mobile here, takes time
}
}
AxControl是由Visual Studio生成的.NET Interop Wrapper DLL。那里的每个ActiveX控件都是从.NET控件派生而来的。 (当然可以将它放到Windows窗体上)。 – 2010-06-16 08:30:16