Обращение к массиву из разных потоков - 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
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д