ASP.NET потоковая передача с параметром?

#c# #asp.net #vb.net #multithreading

#c# #asp.net #vb.net #многопоточность

Вопрос:

ASP.NET 3.5 . VB.NET

У меня есть код, с помощью которого я хочу извлекать изображения в формате PNG с каждого из 10 различных URL-адресов.

Я обнаружил, что получение каждого PNG-файла может занять до 2-3 секунд, поэтому подумал, что было бы лучше получить их все одновременно.

Может ли кто-нибудь помочь мне, изменив приведенный ниже код, чтобы создать поток для каждой выборки PNG? Раньше я не делал много работы с потоками, и после часа или около того попыток я надеялся на некоторую помощь. TIA

 Imports Microsoft.VisualBasic
Imports System.Collections.Generic
Imports System.Drawing
Imports System.Drawing.Drawing2D


Public Class TestImageSuggestionsCreate

    Dim intClsWidthMaximumAllowed As Integer = 600
    Dim intClsHeightMaximumAllowed As Integer = 400
    Dim intClsWidthMinimumAllowed As Integer = 200
    Dim intClsHeightMinimumAllowed As Integer = 200

    Dim strClsImageOriginalURL As String = ""
    Dim lstClsWebsitesImageURLs As New List(Of String)


    Public Function fWebsitesImageSuggestionsCreate() As Boolean

        'Load URLS strings into class List variable: lstClsWebsitesImageURLs
        fWebsitesImageURLSuggestionsGet()

        'Go through each URL and download image to disk
        For Each strURL1 As String In lstClsWebsitesImageURLs

            'This needs to be done in a separate thread 
            '(Up to 10 threads):

            fAddImageIfSuitable(strURL1)

        Next

    End Function

    Private Function fWebsitesImageURLSuggestionsGet() As Boolean

        Dim strURL As String = ""

        strURL = "https://upload.wikimedia.org/wikipedia/en/thumb/f/f7/Sheraton_Hotels.svg/1231px-Sheraton_Hotels.svg.png"
        lstClsWebsitesImageURLs.Add(strURL)

        strURL = "http://wall--art.com/wp-content/uploads/2014/10/sheraton-logo-png.png"
        lstClsWebsitesImageURLs.Add(strURL)

        'Up to 10 strURL items
        '.............

    End Function

    Private Function fAddImageIfSuitable(ByVal strImageURL As String) As Boolean

        'Get bitmap from URL
        Dim btmImage1 As Bitmap = New Bitmap(fGetStreamBitmap(strImageURL))

        'Don't add if image too small
        If btmImage1.Width < intClsWidthMinimumAllowed Or _
            btmImage1.Height < intClsHeightMinimumAllowed Then
            Exit Function
        End If

        'Save image to disk here
        '..............

    End Function

    Private Function fGetStreamBitmap(ByVal strURL As String) As Bitmap

        Try
            Dim request As System.Net.WebRequest = System.Net.WebRequest.Create(strURL)
            Dim response As System.Net.WebResponse = request.GetResponse()
            Dim responseStream As System.IO.Stream = response.GetResponseStream()
            Dim btmBitmap1 As New Bitmap(responseStream)

            Return btmBitmap1

        Finally
        End Try

    End Function

End Class
 

Ответ №1:

Создайте 10 задач, массив задач для каждой задачи вызовите асинхронный метод (тот же метод, который обрабатывает URL-адрес для загрузки изображения на диск), дождитесь возврата всего потока

 var tasks = new List<Task>();
foreach(task in tasks){
task[0] = GetImageAsync();}

Task.WaitAll(tasks.ToArray());
 

Комментарии:

1. Спасибо, но, увы, проект находится в ASP.NET 3.5.

2. @user1946932 — Это было бы неплохо знать с самого начала.

3. @Enigmativity — Да, извиняюсь.

Ответ №2:

Используется Parallel.ForEach для упрощения многопоточности.

Как: написать простую параллель.Цикл ForEach

Вы можете ограничить количество потоков с MaxDegreeOfParallelism помощью .

 Parallel.ForEach(
    lstClsWebsitesImageURLs,
    new ParallelOptions { MaxDegreeOfParallelism = 10 },
    strURL1 => { fAddImageIfSuitable(strURL1); }
);
 

Комментарии:

1. Спасибо, но, увы, проект находится в ASP.NET 3.5.

2. @user1946932 — Это было бы неплохо знать с самого начала.