【发布时间】:2011-03-04 08:29:34
【问题描述】:
我遇到了线程和处理资源的问题。
我有一个 C# Windows 窗体应用程序,它在线程中运行昂贵的操作。此线程实例化一个 ActiveX 控件 (AxControl)。必须释放此控件,因为它使用大量内存。所以我实现了一个 Dispose() 方法,甚至一个析构函数。
线程结束后,析构函数被调用。遗憾的是,这是由 UI 线程调用的。所以调用 activexControl.Dispose();失败并显示消息“COM 对象已与其底层 RCW 分离”,因为该对象属于另一个线程。
如何正确地做到这一点,或者它只是我使用的一个糟糕的设计?
(我将代码精简到最低限度,包括消除任何安全问题。)
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
}
}
【问题讨论】:
标签: garbage-collection activex c#-2.0