为了确保COM对象在执行长时间运行的任务时不会被垃圾回收,可以使用以下方法:
public class ComManager : IDisposable
{
private readonly Queue _taskQueue = new Queue();
private readonly object _lockObj = new object();
private readonly ComObject _comObject;
private readonly Thread _workerThread;
private bool _isDisposed;
public ComManager()
{
// 创建COM对象
_comObject = new ComObject();
// 创建工作线程来处理任务队列
_workerThread = new Thread(WorkerThread);
_workerThread.Start();
}
public void Dispose()
{
if (!_isDisposed)
{
// 等待所有任务完成
lock (_lockObj)
{
while (_taskQueue.Count > 0)
{
Monitor.Wait(_lockObj);
}
}
// 停止工作线程并释放COM对象
_workerThread.Abort();
_comObject.Dispose();
_isDisposed = true;
}
}
public void EnqueueTask(Action task)
{
lock (_lockObj)
{
_taskQueue.Enqueue(task);
Monitor.Pulse(_lockObj);
}
}
private void WorkerThread()
{
while (true)
{
Action task = null;
lock (_lockObj)
{
if (_taskQueue.Count > 0)
{
task = _taskQueue.Dequeue();
}
else
{
Monitor.Wait(_lockObj);
}
}
if (task != null)
{
// 执行任务
task.Invoke();
}
}
}
}
using (var comManager = new ComManager())
{
for (int i = 0; i < 10; i++)
{
int taskIndex = i; // 缓存循环