Обращение к массиву из разных потоков - 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

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 4 из 5
Похожие ответы