发生COMException:ErrorCode = -2147287036

时间:2011-03-09 14:01:07

标签: c# visual-studio multithreading io comexception

我必须并行化一个应用程序;这个应用程序必须处理一个文件,我使用任务,每个线程正在处理一行数据(以前用于逐行处理行)。问题是数据提供者使用某种缓存并且在此过程中它还多次访问文件,因此使用一个数据提供者是一项艰苦的工作线程安全,而不是每次线程处理一行时我在新数据提供程序上创建。它适用于前几次运行,但一段时间后,用于访问该文件的COM对象开始抛出以下错误:

发生COMException ErrorCode = -2147287036

我检查“2147287036”是“没有足够资源打开另一个文件”的错误代码。我确定我正在为数据提供者/ COM对象调用close / dispose,所以我很难理解为什么我无法访问该文件(我有一个异常处理逻辑,试图打开< strong>写入模式如果不成功,它会尝试在读取模式中打开它,如果不成功则会再次抛出异常,这基本上就是上面提到的异常。

我的第一个线索是COM对象不会立即释放文件句柄。但这仍然没有多大意义。

2 个答案:

答案 0 :(得分:1)

生成器/消费者设置是不是更好,单个生产者逐行读入文件并将其提供到消费者线程可以全部用完的队列中?

从多个线程打开相同的文件来进行重度运算听起来有点麻烦。

很抱歉,如果我错过了解您的问题。

答案 1 :(得分:0)

我发现了这个问题。有一个内存泄漏,在代码的某些部分,正在创建COM对象的一些副本并且没有释放,显然Marshal.ReleaseComObject(...)递减计数器对应于COM对象的引用数量并且仅释放如果该数字变为0。