Обращение к массиву из разных потоков - Visual Basic .NET
Формулировка задачи:
Работа с потоками - материал объемный и я его осваиваю частями и по мере необходимости. Делегатами для управлением формой я пользоваться научился. Теперь новая проблема, нужно после скачивания файла в потоке внести об этом информацию в глобальный массив. Явно, если работают десятки потоков то могут быть непредсказуемые результаты при обращении к массиву всех потоков разом.
Посоветуйте, пожалуйста, в каком направлении копать.
Решение задачи: «Обращение к массиву из разных потоков»
textual
Листинг программы
Imports System.Threading
Public Class Form1
Public MASS() As String ' массив для совместной работы потоков
Public SEM As New Semaphore(1, 1) ' объявляем семафор
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
ReDim MASS(0) ' очищаем массив
For i = 1 To 1000
StartDownload(i) ' запускаем поток и передаем в него порядковый номер
Next i
Threading.Thread.Sleep(100) ' ждем окончания всех потоков
MsgBox("В массив записали данные " & MASS.GetUpperBound(0) & " потоков!")
End Sub
Structure RequestParam ' Структура для передачи параметров в поток
Dim A As String
Sub New(ByVal B As String)
Me.A = B
End Sub
End Structure
Sub WebDownload(ByVal obj As Object) ' Процедура которая будет работать в потоке (через структуру RequestParam)
If (obj.GetType().Name <> GetType(RequestParam).Name) Then Return
Dim rp As RequestParam = CType(obj, RequestParam)
Dim A As String = rp.A
Threading.Thread.Sleep(Rnd() * 100) ' приостанавливаем поток чтобы их больше перепутать
SEM.WaitOne() ' блокирует поток до получения сигнала о том что остальные потоки освободили семафор
ReDim Preserve MASS(MASS.GetUpperBound(0) + 1) ' увеличиваем массив на одну ячейку
MASS(MASS.GetUpperBound(0)) = A ' добавляем в массив порядковый номер потока
SEM.Release() ' освобождаем семафор
End Sub
Sub StartDownload(ByVal A As String) ' Процедура запуска потока
Dim ThreadDownload As New System.Threading.Thread(AddressOf WebDownload)
Dim rp As RequestParam = New RequestParam(A)
ThreadDownload.Start(rp)
End Sub
End Class