简而言之,我试图在完成时对使用线程池的传入结果进行“排序”。我有一个实用的解决方案,但世界上没有办法是最好的方法(它容易出现巨大的停顿)。所以我在这里!我将尝试指出正在发生的事情/需要发生的事情的要点,然后发布我当前的解决方案。
代码的目的是获取有关目录中文件的信息,然后将其写入文本文件。
我有一个列表(Counter.ListOfFiles),它是以特定方式排序的文件路径列表。这是指示我需要写入文本文件的顺序的指南。
我正在使用线程池来收集有关每个文件的信息,创建一个字符串构建器,其中所有文本都准备好写入文本文件。然后我调用一个过程(SyncUpdate,包括在下面),从该线程发送 stringbuilder(strBld) 以及特定线程刚刚写入 stringbuilder about(Xref) 的文件的路径名称。
该过程包括一个同步锁来保持所有其他线程,直到它找到一个传递正确信息的线程。该“正确”信息是当线程传递的外部参照与我的列表中的第一项(FirstListItem)匹配时。发生这种情况时,我会写入文本文件,删除列表中的第一项,然后使用下一个线程再次执行此操作。
我使用显示器的方式可能不是很好,事实上我毫不怀疑我正在以一种令人反感的肆意方式使用它。基本上,当外部参照(来自线程)<>我列表中的第一项时,我正在为监视器做一个脉冲。我最初使用的是 monitor.wait,但它最终会放弃尝试对列表进行排序,即使在其他地方使用脉冲也是如此。我可能只是在笨拙地编码一些东西。不管怎样,我认为这不会改变任何事情。
基本上问题归结为这样一个事实,即监视器将脉冲通过它在队列中的所有项目,当我正在寻找的项目很有可能在队列中较早的某个地方传递给它时,或者其他什么地方,它现在将再次对所有项目进行排序,然后再循环查找匹配的条件。这样做的结果是我的代码将遇到其中一个并需要大量时间才能完成。
我愿意相信我只是在工作中使用了错误的工具,或者只是没有正确使用我拥有的工具。我非常喜欢某种线程解决方案(不出所料,它要快得多!)。今天我一直在搞乱并行任务功能,很多东西看起来很有希望,但我对线程池的经验甚至更少,你可以看到我是如何滥用它的!也许有队列的东西?你明白了。我没有方向。任何人可以建议将不胜感激。谢谢!如果您需要任何其他信息,请告诉我。
Private Sub SyncUpdateResource(strBld As Object, Xref As String)
SyncLock (CType(strBld, StringBuilder))
Dim FirstListitem As String = counter.ListOfFiles.First
Do While Xref <> FirstListitem
FirstListitem = Counter.ListOfFiles.First
'This makes the code much faster for reasons I can only guess at.
Thread.Sleep(5)
Monitor.PulseAll(CType(strBld, StringBuilder))
Loop
Dim strVol As String = Form1.Volname
Dim strLFPPath As String = Form1.txtPathDir
My.Computer.FileSystem.WriteAllText(strLFPPath & "\" & strVol & ".txt", strBld.ToString, True)
Counter.ListOfFiles.Remove(Xref)
End SyncLock
End Sub