Короче говоря, я пытаюсь «сортировать» входящие результаты использования threadpooling по мере их завершения. У меня есть функциональное решение, но в мире нет способа сделать это лучше (он подвержен огромным паузам). И вот я здесь! Я постараюсь поразить пулевые моменты того, что происходит/что должно произойти, а затем опубликовать мое текущее решение.VB.NET, лучшая практика для сортировки параллельных результатов threadpooling?
Цель кода - получить информацию о файлах в каталоге и затем записать его в текстовый файл.
У меня есть список (Counter.ListOfFiles), который представляет собой список путей к файлу, отсортированных определенным образом. Это руководство, которое диктует порядок, который мне нужно записать в текстовый файл.
Я использую threadpool для сбора информации о каждом файле, создаю строковый конструктор со всем текстом, готовым для записи в текстовый файл. Затем я вызываю процедуру (SyncUpdate, inlcluded ниже), отправляю stringbuilder (strBld) из этого потока вместе с именем пути к файлу, который конкретный поток только что написал в stringbuilder о (Xref).
Процедура включает в себя синхронизацию для хранения всех остальных потоков, пока не найдет поток, передающий правильную информацию. Эта «правильная» информация возникает, когда xref, переданный потоком, соответствует первому элементу в моем списке (FirstListItem). Когда это произойдет, я пишу в текстовый файл, удаляю первый элемент в списке и делаю его снова со следующим потоком.
Способ, которым я пользуюсь монитором, вероятно, невелик, на самом деле у меня мало сомнений в том, что я использую его в наступательной беспристрастной манере. В основном в то время как xref (из потока) <> первый элемент в моем списке, я делаю импульс для монитора. Я изначально использовал monitor.wait, но в конечном итоге просто отказался от попыток отсортировать список, даже если вы используете импульс в другом месте. Возможно, я просто что-то кодировал неловко. В любом случае, я не думаю, что это что-то изменит.
В основном проблема сводится к тому, что монитор будет пульсировать через все предметы, которые он имеет в очереди, когда есть хороший шанс, что элемент, который я ищу, вероятно, передан ему где-то раньше в очереди или независимо от того, и теперь он будет сортировать все элементы снова, прежде чем переходить назад, чтобы найти критерии, которые соответствуют. Результатом этого является то, что мой код попадет в один из них и займет огромное количество времени.
Я открыт, чтобы поверить, что я использую неправильный инструмент для работы или просто не использую инструмент, который у меня есть. Я бы предпочел какое-то резьбовое решение (неудивительно, это намного быстрее!). Сегодня я немного бормочу с функциональностью Parallel Task, и многие вещи выглядят многообещающе, но у меня есть еще меньше опыта с этим vs. threadpool, и вы можете видеть, как я злоупотребляю этим! Может быть, что-то с очередью? Вы поняли эту идею. Я бесцельный. Все, что можно было бы предложить, было бы очень оценено. Благодаря! Дайте мне знать, если вам нужна дополнительная информация.
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
Превосходно полезно. Я с удовольствием получаю слишком много информации в любой день. Благодаря! У меня может быть что-то вроде продолжения. – Finch042
У меня определенно была задача превратить код двоичной кучи в vb.net. Я все еще довольно новичок в vb.net, поэтому попытка интерпретировать что-то из C# довольно сложна. Какие-нибудь советы? – Finch042
@ Finch042: На самом деле никаких советов. Я не ужасно властен в VB. Я могу запутать свой путь. Лучше всего, если вы столкнетесь с камнем преткновения, отправьте вопрос о SO с соответствующим фрагментом кода и попыткой его преобразования. Вероятно, кто-то может тебе помочь. –