0

アプリケーションを並列化する必要があります。このアプリケーションはファイルを処理する必要があり、タスクを使用し、各スレッドは1行のデータを処理しています(以前は1行ずつ順番に処理していました)。問題は、データプロバイダーが何らかのキャッシュを使用し、プロセス中にファイルに複数回アクセスすることです。そのため、1つのデータプロバイダーを使用することは、スレッドセーフにするための大変な作業でした。代わりに、毎回新しいデータプロバイダーで作成しました。スレッドが行を処理しています。最初の数回の実行では正常に機能しますが、しばらくすると、ファイルへのアクセスに使用されるCOMオブジェクトが次のエラーをスローし始めます。

COMExceptionが発生しましたErrorCode = -2147287036

「2147287036」を確認したところ、「別のファイルを開くのに十分なリソースがありません」のエラーコードです。データプロバイダー/COMオブジェクトのclose/disposeを呼び出していると確信しているので、ファイルにアクセスできない理由を理解するのに苦労しています(書き込みでファイルを開こうとする例外処理ロジックがあります)モードであり、失敗した場合は読み取りモードで開こうとし、失敗した場合は基本的に上記の例外をスローします。

私の最初の手がかりは、COMオブジェクトがファイルハンドルをすぐに解放しないことです。しかし、それでもそれはあまり意味がありません。

4

2 に答える 2

1

単一のプロデューサーがファイルを1行ずつ読み取り、それをコンシューマースレッドがすべて出力できるキューにフィードするプロデューサー/コンシューマーセットアップを用意する方がよいのではないでしょうか。

複数のスレッドから同じファイルを開いて重いクランチを行うのは、少し面倒に聞こえます。

誤解してすみません-あなたの問題を理解しました。

于 2011-03-09T15:04:30.307 に答える
0

問題を見つけました。メモリリークが発生しました。コードの一部で、COMオブジェクトの一部のコピーが作成されて解放されておらず、明らかにMarshal.ReleaseComObject(...)は、COMオブジェクトへの参照の数に対応するカウンターをデクリメントし、解放するだけです。その数が0になった場合。

于 2011-03-10T14:17:13.560 に答える