0

我必须并行化一个应用程序;这个应用程序必须处理一个文件,我使用了任务,每个线程都在处理一行数据(以前它用于逐行处理)。问题是数据提供者使用某种缓存,并且在此过程中多次访问文件,因此使用一个数据提供者很难使其成为线程安全的,相反我每次都在新的数据提供者上创建一个线程正在处理一行。它在前几次运行中运行良好,但一段时间后用于访问文件的 COM 对象开始抛出以下错误:

发生 COMException错误代码 = -2147287036

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

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

4

2 回答 2

1

有一个生产者/消费者设置,其中单个生产者逐行读取文件并将其馈送到消费者线程可以全力以赴的队列中,这不是更好吗?

从多个线程打开同一个文件来进行繁重的处理听起来有点麻烦。

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

于 2011-03-09T15:04:30.307 回答
0

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

于 2011-03-10T14:17:13.560 回答