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