Обращение к массиву из разных потоков - Visual Basic .NET

Узнай цену своей работы

Формулировка задачи:

Работа с потоками - материал объемный и я его осваиваю частями и по мере необходимости. Делегатами для управлением формой я пользоваться научился. Теперь новая проблема, нужно после скачивания файла в потоке внести об этом информацию в глобальный массив. Явно, если работают десятки потоков то могут быть непредсказуемые результаты при обращении к массиву всех потоков разом. Посоветуйте, пожалуйста, в каком направлении копать.

Решение задачи: «Обращение к массиву из разных потоков»

textual
Листинг программы
  1. Imports System.Threading
  2. Public Class Form1
  3.     Public MASS() As String ' массив для совместной работы потоков
  4.     Public SEM As New Semaphore(1, 1) ' объявляем семафор
  5.     Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  6.         ReDim MASS(0) ' очищаем массив
  7.         For i = 1 To 1000
  8.             StartDownload(i) ' запускаем поток и передаем в него порядковый номер
  9.         Next i
  10.         Threading.Thread.Sleep(100) ' ждем окончания всех потоков
  11.         MsgBox("В массив записали данные " & MASS.GetUpperBound(0) & " потоков!")
  12.     End Sub
  13.     Structure RequestParam ' Структура для передачи параметров в поток
  14.         Dim A As String
  15.         Sub New(ByVal B As String)
  16.             Me.A = B
  17.         End Sub
  18.     End Structure
  19.     Sub WebDownload(ByVal obj As Object) ' Процедура которая будет работать в потоке (через структуру RequestParam)
  20.         If (obj.GetType().Name <> GetType(RequestParam).Name) Then Return
  21.         Dim rp As RequestParam = CType(obj, RequestParam)
  22.         Dim A As String = rp.A
  23.         Threading.Thread.Sleep(Rnd() * 100) ' приостанавливаем поток чтобы их больше перепутать
  24.         SEM.WaitOne() ' блокирует поток до получения сигнала о том что остальные потоки освободили семафор
  25.         ReDim Preserve MASS(MASS.GetUpperBound(0) + 1) ' увеличиваем массив на одну ячейку
  26.         MASS(MASS.GetUpperBound(0)) = A ' добавляем в массив порядковый номер потока
  27.         SEM.Release() ' освобождаем семафор
  28.     End Sub
  29.     Sub StartDownload(ByVal A As String) ' Процедура запуска потока
  30.         Dim ThreadDownload As New System.Threading.Thread(AddressOf WebDownload)
  31.         Dim rp As RequestParam = New RequestParam(A)
  32.         ThreadDownload.Start(rp)
  33.     End Sub
  34. End Class

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


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

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

13   голосов , оценка 4 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы