【发布时间】:2013-08-29 13:22:40
【问题描述】:
我正在创建一个从数据库中获取文件数据的程序。要求是文件在存在“IMAGE_00001.JPG”、“IMAGE_00002.JPG”、...
由于性能问题,我正在并行加载数据,但在创建文件时遇到了问题。
For i As Long = 1 To maxSeqNr
DIDir = New DirectoryInfo(currDir)
If DIDir.GetFiles(currFilePrefix & Microsoft.VisualBasic.Right(maxSeqNrLeadingZeros & CStr(i), Len(maxSeqNr.ToString)) & ".*", SearchOption.TopDirectoryOnly).Length = 0 Then
sRetValue = currFilePrefix & Microsoft.VisualBasic.Right(maxSeqNrLeadingZeros & CStr(i), Len(maxSeqNr.ToString)) & currFileExtention
Dim oSW As StreamWriter
oSW = New StreamWriter(currDir & sRetValue)
oSW.WriteLine("")
oSW.Close()
oSW.Dispose()
oSW = Nothing
Exit For
End If
Next
问题是有时 2 个线程运行同一行代码。 我添加了日志记录,我发现了这个:
Check for 'IMAGE_00001.JPG' ; Directory: ''
Check for 'IMAGE_00001.JPG' ; Directory: ''
Check for 'IMAGE_00002.JPG' ; Directory: 'IMAGE_00001.JPG'
Check for 'IMAGE_00003.JPG' ; Directory: 'IMAGE_00001.JPG,IMAGE_00002.JPG'
在我执行 Exists 语句之前是否有可能“锁定”工作目录。创建文件后“释放”? 其他线程应该等到他们可以“锁定”目录。
【问题讨论】:
-
你应该使用data structure which supports a producer/consumer strategy 这样他们就不会检查相同的文件,否则你的性能仍然会很差。
-
@user7116 我不确定你为什么建议使用数据结构?我有一个带有 id 的集合,我获取数据,创建文件并将流写入该文件。我的代码中没有并行保存
-
你是如何建立文件名的? (sFileName)。这就是问题的症结所在。向我们展示你在做什么。
-
@xanatos 我更新了我的问题
-
@Stinus:因为您最初提供了 0 个有关如何获得文件名的详细信息。您需要 (1) 使用数据结构将文件名分配给各个线程,或者 (2) 使用其他方式(例如
Parallel.For)分配文件名。
标签: .net vb.net multithreading file-io