Oppure

Loading
30/07/12 15:05
rocco8620
Buongiono a tutti,
ho creato un programma che permette di gestire una mail list e ho inserito la funzione di invio "automatico" delle email prelevando l' indirizzo da una listbox e incrementando di 1 un label che funziona da contatore. Il problema che si verifica è che l' aggiornamento del label avviene in ritardo,cioè se devo inviare 10 mail il label sembra bloccato a 0 poi passa di colpo a 10 quando l' invio delle mail è completato.
come posso fare in modo che il label venga incrementato correttamente?

questo è il codice che uso per l' invio delle mail:


Imports System.IO
Imports System.Net.
    Dim sendcount As Integer
    Dim sendcounttotal As Integer


Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    
sendcounttotal = Form1.ListBox2.Items.Count
        Label1.Text = "Invio 00 di " & sendcounttotal
        Try
                For i As Integer = 0 To .Items.Count - 1
                    Dim MyMailMessage As New MailMessage()
                    MyMailMessage.From = New MailAddress(.TextBox7.Text)
                    MyMailMessage.To.Add(.Items(i))
                    MyMailMessage.Subject = (TextBox9.Text)
                    MyMailMessage.Body = (Form1.textomail)
                    Dim SMTPServer As New SmtpClient("Smtp.gmail.com")
                    SMTPServer.Port = 587
                    SMTPServer.Credentials = New     System.Net.NetworkCredential(TextBox7.Text, TextBox8.Text)
                    SMTPServer.EnableSsl = True
                    SMTPServer.Send(MyMailMessage)
                    sendcount = sendcount + 1
                    Label1.Text = "invio " & sendcount & " di " & sendcounttotal
                Next
            End With

             MsgBox("Mail inviate correttamente!")

        Catch ex As Exception
           MsgBox("Errore nell' invio delle mail", MsgBoxStyle.Critical)
        End Try

end sub
Ultima modifica effettuata da rocco8620 30/07/12 15:06
aaa
30/07/12 16:03
walker93
prima di terminare il ciclo con next iserisci un "Application.DoEvents()"
aaa
30/07/12 16:59
rocco8620
Inserendo il comando che mi hai specificato il label si aggiorna correttamente,
ma sorge un altro problema, il contatore (i) che si occupa di contare le mail inviate si "ferma" a 2 provocando il mancato invio di tutte le mail successive. la cosa strana è che inserendo il comando
 Msgbox(sendcounttotal) 
subito dopo il comando
 sendcounttotal = Form1.ListBox2.Items.Count 
mi viene mostrato il numero di items presenti nella listbox invece se inserisco
 Msgbox(.items.count -1) 
dopo il comando
 For i As Integer = 0 To .Items.Count - 1 
nel messaggio mi compare "2", come posso rissolvere?
Ultima modifica effettuata da rocco8620 30/07/12 17:02
aaa
30/07/12 20:56
rocco8620
Ho risolto il problema, avevo sbagliato il riferimento alla listbox2 inpostando il recupero dei dati dalla listbox1.

grazie per il tuo aiuto riguardo al label :k:
aaa
31/07/12 10:16
Renny
Ciao..
Anche se hai risolto, magari puoi essere interessato a una soluzione formalmente più corretta.
Per fare quello che richiedi dovresti usare un controllo backgroundWorker che permette di gestire le operazioni (invio email e aggiornamento interfaccia programma) come 2 thread separati.
Il controllo è fatto apposta per eseguire operazioni ripetute (tramite ciclo) e mostrare sullo schermo l'avanzamento % di tali operazioni all'utente, magari tramite progress bar anche.
Per una spiegazione del controllo leggiti questo link, che è l'ottima guida di Totem per vb.net
pierotofy.it/pages/guide/Guida_al_Visual_Basic_dotNET/BackgroundWorker_e_FileSystemWatcher/

Ciao!:k:
aaa