我有一个程序可以进行大量比较。它将保存在本地计算机上的特定 .dat 文件与运行时生成的大量其他文件进行比较。现在我无法使用多个线程执行这些比较,因为很多System.AccessViolationException
. 我假设这是因为多个线程试图同时访问同一个本地文件。我怎样才能克服这个问题来与多个线程进行这些比较?
问问题
1181 次
1 回答
3
您的访问违规有几个可能的原因:
- 多个线程专门锁定您的特定 .dat 文件
- 就多个线程尝试读取相同的运行时生成的文件而言,您的多线程是错误的
- 您的多线程是错误的,因为您的线程在完全生成之前尝试读取运行时生成的文件
存在以下解决方案:
- 一次将 .dat 文件读入内存并在所有线程之间共享该数据。这也减少了 I/O 负载
- 确保每个运行时生成的文件仅由一个线程进行比较。这可以通过一个线程安全队列来实现,该队列包含所有需要比较的文件并且在所有线程之间共享。
- 确保运行时生成的文件只有在完全创建后才被读取线程知道。这可以通过在同一磁盘上的不同目录中创建它并将其移动到目标目录来实现,仅在创建完成后将文件名从解决方案 2 中放入队列中。
正如 Matthew Watson 正确指出的那样,anAccessViolationException
是由非托管代码中的错误引起的,因此它可能不是由多个线程试图访问同一个文件引起的。
因此,我的回答假设您实际上获得了UnauthorizedAccessException
.
如果不是这种情况,并且您确实遇到了问题,那么AccessViolationException
您的问题很可能出在其他地方。
于 2013-08-07T13:08:10.347 回答