Uruchomienie kilku Thread - proszę o przeanalizowanie kodu, co jest źle?

0

Od 3 dni już się męczę z tym kodem, napisałem ponownie całą aplikację od zera - wydawałoby się że jest wszystko dobrze - a jednak nie ważne jaką ilość wątków dam programowi , to "szybkość" działania aplikacji nie ulega zmianie.
Czy to będzie 1 wątek, czy 30 to i tak program działa tak samo.
Nie wiem co znowu zrobiłem źle, daje cały kod (prawie) aby ktoś mądry mógł zerknąć na to:
@ness

Imports System.Security.Cryptography
Imports System.Text
Imports System.Threading
Imports System.Threading.Tasks
Public Class Form1

    Dim liczba_watkow As Integer = 1
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
'przypisuje liczbę wątków z TextBoxa (ile wątków aplikacja ma uruchomić)
        liczba_watkow = CInt(TextBox1.Text)
        Dim aktualny_watek As Integer = 1
'uruchamiamy tyle wątków, ile podaliśmy w RichTextBoxie pętlą For
'------------------------------------------------------------------------------------------------------------
        For aktualny_watek = 1 To liczba_watkow
'przypisuje wartość linijki, czyli "email" z którym program będzie pracować (dla każdego wątka inna)
            Dim zacznij_od_linijki As Integer = aktualny_watek
            Dim plus_watkow As Integer = liczba_watkow
'Każdy z wątków uruchamia procedurę z parametrem linijki z RichTextBoxa, z którym ma pracować
            Dim T1 As New Thread(New ThreadStart(Sub() uruchom_jeden_watek(zacznij_od_linijki, plus_watkow)))
            T1.Start()
        Next
'------------------------------------------------------------------------------------------------------------
    End Sub

'delegat aby "wyciągać" dane z TextBoxów, RichTextBoxów bezpośrednio dla potrzeb w wątku
    Public Delegate Function pobierz_delegat(parameters As String, linijka As Integer) As String
    Private Function pobierz(parameters As String, linijka As Integer) As String
        pobierz = ""
        If InvokeRequired Then
            Return (Me.Invoke(New pobierz_delegat(AddressOf pobierz), parameters, linijka))
        Else
            Select Case parameters
                Case "RichTextBox1.Lines.Count"
                    pobierz = CStr(RichTextBox1.Lines.Count)
                Case "RichTextBox1.Lines"
                    If RichTextBox1.Text <> "" Then
                        pobierz = CStr(RichTextBox1.Lines(linijka - 1))
                    Else
                        pobierz = "empty"
                    End If
                Case "RichTextBox2.Lines.Count"
                    pobierz = CStr(RichTextBox2.Lines.Count)
                Case "RichTextBox2.Lines"
                    If RichTextBox2.Text <> "" Then
                        pobierz = CStr(RichTextBox2.Lines(linijka - 1))
                    Else
                        pobierz = "empty"
                    End If
            End Select
        End If
    End Function

    Private Sub uruchom_jeden_watek(zacznij_od_linijki As Integer, plus_watkow As Integer)
        Dim liczba_maili As String = pobierz("RichTextBox1.Lines.Count", 0)
        Dim email As String = pobierz("RichTextBox1.Lines", zacznij_od_linijki)
        Dim liczba_tresc As String = pobierz("RichTextBox2.Lines.Count", 0)
        If liczba_maili >= zacznij_od_linijki And email <> "empty" Then
'przypisuje dla każdego z emaila - treść jaką ma wysyłać wątek, pętlą For - pobierając wartości z linijek RichTextBox2
            For i As Integer = 1 To liczba_tresc
'Tu przypisujemy indywidualną treść jaką ma wysyłać email (pobraną z RichctextBox2)
                Dim tresc As String = pobierz("RichTextBox2.Lines", i)
                If tresc <> "empty" Then
'-----------------------------------TU WYWOLUJE WYSYLANIE MAILA-----------------------------------------
                    wysylanie(email, tresc)
'------------------------------------------------------------------------------------------------------------
                    'zamiast powyzszej linijki probowalem wkleic zawartosc bezposrednio procedury - wysylanie
                Else
                End If
            Next
'tu bylo kilka linijek (nie istotne, wykorzystujace parametr - plus_watkow)
'tu bylo kilka linijek (nie istotne, wykorzystujace parametr - plus_watkow)
        End If
    End Sub


    Async Sub wysylanie(email, tresc)
        Try
            'tu bylo kilka linijek skryptu wysylania
            'tu bylo kilka linijek skryptu wysylania
            'tu bylo kilka linijek skryptu wysylania
            'tu bylo kilka linijek skryptu wysylania
'PONIZSZA LINIJKA MOIM ZDANIEM WSTRZYMUJE PRACE WATKOW- do czasu az otrzyma result - dlatego zapewne wątki nie działają równocześnie
'--------------------------------------------------------------------------------------------------------------------------
            Dim bytRetData As Byte() = Await manualWebClient.UploadDataTaskAsync("http://mojserwerwis.pl/", "POST", bytArguments)
'--------------------------------------------------------------------------------------------------------------------------
            Dim response As String = System.Text.Encoding.ASCII.GetString(bytRetData)
            'tu bylo kilka linijek skryptu wysylania
            'tu bylo kilka linijek skryptu wysylania
        Catch
        End Try
    End Sub



End Class

wydaje mi się że WebClient nie wspiera operacji asynchronicznych dla kilku operacji

1

Nie wiadomo, co się w tym kodzie dzieje.
Mieszasz nazewnictwo od czasowników, rzeczowników, polskie, angielskie i kij wie co jeszcze, funkcje nie są okomentowane...
Można jedynie stwierdzić coś tu nie gra.

0
Patryk27 napisał(a):

Nie wiadomo, co się w tym kodzie dzieje.
Mieszasz nazewnictwo od czasowników, rzeczowników, polskie, angielskie i kij wie co jeszcze, funkcje nie są okomentowane...
Można jedynie stwierdzić coś tu nie gra.

@Patryk27

Jest kilka Richtextboxów
jeden zawiera emaile
kolejny zawiera treści

Pętla For uruchamia kilka wątków lecz mam wrażenie że ta linijka "wstrzymuje działanie":

 Dim bytRetData As Byte() = Await manualWebClient.UploadDataTaskAsync("http://mojserwerwis.pl/", "POST", bytArguments)

Bo wsszystkie wątki nie działają równocześnie, tylko tak jakby "na zmianę"

0

No ale co ten program ma w ogóle robić?
Nikt z nas nie siedzi w Twojej głowie i to, że wrzucisz jakiś kod, który Ty rozumiesz, nie sprawia, że inni też zaczną.

0

Pętla For uruchamia kilka wątków lecz mam wrażenie że ta linijka "wstrzymuje działanie":

Bo wsszystkie wątki nie działają równocześnie, tylko tak jakby "na zmianę"

A jesteś w ogóle czegoś pewien, czy sam nie wiesz co się dzieje w tym kodzie i dlaczego, a oczekujesz, że ktoś połapie się w tym bajzlu?

0

Program początkowo pobiera wartości z RichTextBoxów, takie jak:

RichtextBox1 = zawiera emaile
RichtextBox2 = zawiera treść mailową

następnie program uruchamia pętlą For tyle wątków (równoczesnych procesów wysyłania maili) ile podaliśmy w TextBox1:

Program początkowo pobiera wartości z RichTextBoxów, takie jak:

RichtextBox1 = zawiera emaile
RichtextBox2 = zawiera treść mailową

następnie program uruchamia pętlą For tyle wątków (równoczesnych procesów wysyłania maili) ile podaliśmy w TextBox1:

        For aktualny_watek = 1 To liczba_watkow
            Dim zacznij_od_linijki As Integer = aktualny_watek
            Dim plus_watkow As Integer = liczba_watkow
            Dim T1 As New Thread(New ThreadStart(Sub() uruchom_jeden_watek(zacznij_od_linijki, plus_watkow)))
            T1.Start()
        Next

Jednocześnie każdy z powyższych wątków uruchamia procedurę w której przypisywana jest treść do indywidualnego odbiorcy emaila
i wywołuje procedurę wysłania emaila:

                    wysylanie(email, tresc)

no i mam wrażenie że procedura "wysylanie" lub coś innego w tym programie powstrzymuje działanie wątków..
bo moim celem jest zrobić coś takiego aby jednocześnie, w tej samej sekundzie było uruchomione powiedzmy 5 wątków i każdy wysyłał innego emaila do innego odbiorcy...
Tak niestety nie jest bo jak mam uruchomione 5 wątków , to na przemian wysyłają one to co potrzeba...
ale nie równocześnie...
a to mija się z celem , bo ten sam efekt mogę osiągnąć 1 wątkiem.

2

Może niech zacznie od tego, żeby nie pisał w Visual Basicu ?

0

Proponuję porobić testy na aplikacjach prostych aplikacjach konsolowych bo tutaj masz straszny chaos i sam się gubisz w tym wszystkim. Jakiegoś wielkiego doświadczenia w VB nie mam ale taka aplikacja poglądowa w WinFormsach w dwóch wariantach każdy email w osobnym tasku oraz po dwa maile w jednym wątku w bardzo dużym uproszczeniu:

Imports System.Threading

Public Class MainForm

   Private Sub ButtonStartTask_Click(sender As Object, e As EventArgs) Handles ButtonStartTask.Click
      Dim emails = GetEmails()
      For Each email As String In emails
         Debug.WriteLine("Trwa wysyłanie wiadomość do " + email)
         Dim result = SendMailTask(email)
      Next
   End Sub

   Private Function GetEmails() As String()
      Return RichTextBoxEmails.Lines
   End Function

   Private Async Function SendMailTask(email As String) As Task(Of String)
      Await Task.Delay(_random.Next(5000))
      ' Cuś
      Dim message = String.Format("Wysłano wiadomość do {0}", email)
      Debug.WriteLine(message)
      Return message
   End Function

   Private ReadOnly _random As Random = New Random()

   Private Sub ButtonStartThread_Click(sender As Object, e As EventArgs) Handles ButtonStartThread.Click
      Dim emails = GetEmails()
      For i = 0 To emails.Length Step 2
         Dim emailsToSend = emails.Skip(i).Take(2).ToArray()
         Debug.WriteLine("Trwa wysyłanie wiadomość do " + String.Join(", ", emailsToSend))
         Dim thread = New Thread(AddressOf SendMailThread)
         thread.Start(emailsToSend)
      Next
   End Sub

   Private Sub SendMailThread(emails As String())
      Thread.Sleep(_random.Next(5000))
      ' Cuś
      Dim message = String.Format("Wysłano wiadomość do " + String.Join(", ", emails))
      Debug.WriteLine(message)
   End Sub
End Class
0

Uprzejmie informuję, że czytam forum całkiem regularnie w miarę możliwości czasowych i nie trzeba mnie wzywać ani wysyłać wiadomości prywatnych, żebym zobaczyła temat. Dziękuję za zrozumienie.

Ale skoro uważasz mnie za autorytet, to proszę:

  1. Poprzednicy mają rację. Wrzucasz nieczytelny kod, wołasz: "nie działa" i myślisz, że wiadomo, w czym problem?
  2. Visual Basic to nisza, więc nie oczekuj, że tłumy się rzucą z pomocą. Skoro ktoś go odradza, to pewnie jest powód. Nie zapytałeś o niego, nie wyjaśniłeś, dlaczego akurat tego języka używasz, ale od razu uważasz, że ten ktoś jest przeciwko Tobie. To trochę nie w porządku.
  3. Co wpisałeś w Google, żeby znaleźć podpowiedź? Poważnie pytam.

1 użytkowników online, w tym zalogowanych: 0, gości: 1