【发布时间】:2011-08-10 01:19:43
【问题描述】:
我有一个向 COM 公开的 .NET 组件。
这个组件有一个在内部运行的线程,它连接到一个命名管道,并根据需要处理与管道的断开连接和重新连接。
线程在 COM 程序中实例化的组件实例的生命周期内运行(在此实例中为 vb6)。
如果 COM 应用程序正在关闭,但没有调用优雅地关闭线程(和管道)的“关闭”方法,有没有办法检测它们正在关闭应用程序,这样我就不需要依靠他们正确遵守规则?
线程设置了 ISBackground = true。
这是我的线程的基本部分
private System.IO.Pipes.NamedPipeClientStream mPipe;
private System.Threading.AutoResetEvent mConnectedHold;
private void ConnectPipe()
{
while (mRunning)
{
try
{
mConnecting = true;
mConnected = false;
if (mPipe != null)
{
mPipe.Close();
mPipe.Dispose();
}
mPipe = new System.IO.Pipes.NamedPipeClientStream(@".", @"MyPipe", System.IO.Pipes.PipeDirection.InOut, System.IO.Pipes.PipeOptions.Asynchronous);
mPipe.Connect(1000);
mConnecting = false;
mConnected = true;
mPipe.BeginRead(mBuffer, 0, mBuffer.Length, new AsyncCallback(ReadPipe), null);
mConnectedHold.WaitOne();
}
catch (TimeoutException ex)
{
System.Diagnostics.Debug.Print("Not connected yet");
}
catch (Exception ex)
{
mRunning = false;
}
}
}
收盘是相当基本的。
public void Close()
{
mRunning = false;
if (mPipe != null )
{
mPipe.Close()
mPipe.Dispose()
}
mConnected = false;
}
【问题讨论】:
-
COM 对象并没有像 C# 中的对象那样真正具有“范围”——它们使用引用计数,所以我猜当引用计数达到 0 时会检测到等效项(并且对象被清理)。
标签: .net multithreading com