2011-03-18 4 views
0

Недавно я недавно узнал некоторые основы многопоточности в VB.net, так как мне приходилось обрабатывать большой список записей и вставлять их в базу данных SQL один за другим. У меня есть код выглядят следующим образом:Многопоточная обработка Проблема

Private Sub btnLoadNow_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnLoadNow.Click 

    Dim autoLoad1 As New Thread(AddressOf AutoLoad) 
    autoLoad1.Start() 

    Dim autoLoad2 As New Thread(AddressOf AutoLoad) 
    autoLoad2.Start() 

    Dim autoLoad3 As New Thread(AddressOf AutoLoad) 
    autoLoad3.Start() 

    Dim autoLoad4 As New Thread(AddressOf AutoLoad) 
    autoLoad4.Start() 

    Dim autoLoad5 As New Thread(AddressOf AutoLoad) 
    autoLoad5.Start() 


    Dim autoLoad6 As New Thread(AddressOf AutoLoad) 
    autoLoad6.Start() 

    Dim autoLoad7 As New Thread(AddressOf AutoLoad) 
    autoLoad7.Start() 

    Dim autoLoad8 As New Thread(AddressOf AutoLoad) 
    autoLoad8.Start() 

    Dim autoLoad9 As New Thread(AddressOf AutoLoad) 
    autoLoad9.Start() 

End Sub 

Private Sub AutoLoad() 

for each Item as Record In ItemLists 
    Process Codes 
Next 

End Sub 

Itemlists является глобальными списками я извлекаемые из базы данных, все выглядит нормально для меня, но когда я запустить эту программу, я обнаружил, что нити вставки одной записи в 9 раз в database (у меня всего 9 потоков), что заставляет меня думать, что, возможно, мне нужно специально назначить 1/9 списка для каждого потока? Есть ли другой способ сделать это, что не требует разделения списка, если нет, то как его разделить, а затем назначить? Любая помощь приветствуется.

ответ

0

Я бы не сделал нить на каждую вставку, поскольку накладные расходы на создание потока перевешивают выгоды, которые вы получили от ее вращения. Однако вы можете использовать общую переменную и использовать SyncLock для поддержки параллелизма.

Редактировать, чтобы комментарий Вопрос:

'Replace List(Of String) with your type. 
Public Shared ItemList As New List(Of String) 

Это обычно используется для обновления на памяти в утверждении. Ваша первая нить в конечном итоге сделает всю обработку в вашем примере. Если вы действительно хотели развернуть пару потоков и разделить работу, назначьте каждому потоку имя, а затем проверите логику, чтобы назначить другую работу для каждого потока.

+0

У меня есть synclock внутри кода цикла. Не возражаете ли вы показать мне пример использования общей переменной? Благодарю. – miketonny

Смежные вопросы