Произошло исключение COMException: ErrorCode = -2147287036 - PullRequest
0 голосов
/ 09 марта 2011

Я должен распараллелить приложение;Это приложение должно обрабатывать файл, я использовал tasks , и каждый поток обрабатывает одну строку данных (ранее она использовалась для последовательной обработки строк одна за другой).Проблема заключается в том, что поставщик данных использует своего рода кэширование , а также он обращается к файлу несколько раз во время процесса, поэтому использование одного поставщика данных было сложной задачей, чтобы сделать его поточно-поточным.безопасно, вместо этого я создал новый поставщик данных каждый раз, когда поток обрабатывает строку.Он отлично работает для первых нескольких запусков, но через некоторое время COM-объект, который используется для доступа к файлу, начинает выдавать следующую ошибку:

Произошло исключение COMEx : ErrorCode =-2147287036

Когда я проверил, "2147287036" - это код ошибки для "недостаточно ресурсов для открытия другого файла" .Я уверен, что я вызываю close / dispose для провайдеров данных / COM-объектов, поэтому мне трудно понять, почему я не могу получить доступ к файлу (у меня есть логика обработки исключений, которая пытается открыть файл в режим записи и, если он неуспешен, он пытается открыть его в режиме чтения , и снова, если он неуспешен, он выдает исключение, которое в основном является упомянутым выше).

Моя первая подсказка заключается в том, что COM-объект не освобождает дескриптор файла мгновенно.Но все же это не имеет особого смысла.

Ответы [ 2 ]

1 голос
/ 09 марта 2011

Не лучше ли иметь настройку производителя / потребителя, в которой один производитель читает строку файла построчно и передает его в очередь, где потоки потребителя могут полностью завершиться?

Открытие одного и того же файла из нескольких потоков для выполнения сложных операций звучит немного громоздко.

Извините, если я неправильно понял вашу проблему.

0 голосов
/ 10 марта 2011

Я нашел проблему. Произошла утечка памяти, в некоторых частях кода некоторые копии объекта COM создавались и не выпускались, и, по-видимому, Marshal.ReleaseComObject (...) уменьшает счетчик, соответствующий количеству ссылок на объект COM, и только выпускает это если это число становится 0.

...