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