Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    [VB.NET] Thread non completa le operazioni previste

    La mia applicazione gestisce le vendite di un negozio, quando termino le operazioni di vendita di determinati clienti invia una mail alla loro casella ringraziandoli dell'acquisto fatto.
    Per inviare mail uso la segente routine :
    (I msgbox servono in fase di progettazione solo per verificare il funzionamento)

    codice:
    Sub InviaMailFidelizzazione()
    
            Try
    
                MsgBox("Inizio delle operazioni del thread")
                Dim message As New Net.Mail.MailMessage(My.Settings.FidelizzazioneQMAILMITTENTE, Form18.Label21.Text, My.Settings.FidelizzazioneQOGGETTO, My.Settings.FidelizzazioneQTESTOMAIL & ElencoPrFidel)
                MsgBox(1)
                Dim emailClient As New Net.Mail.SmtpClient(My.Settings.FidelizzazioneQSMTP)
                MsgBox(2)
                emailClient.Send(message)
                MsgBox(3)
                ElencoPrFidel = ""
                MsgBox("Operazioni del thread eseguite con successo")
            Catch ex As InvalidOperationException
                'MessageBox.Show("Non è stato specificato il nome Host del server")
            Catch ex As SmtpFailedRecipientException
                'MessageBox.Show("Tentativo di invio al server locale, ma non è presente una mailbox")
            Catch ex As SmtpException
                'MessageBox.Show("Utente non valido/Host non trovato/Altro errore in fase di invio")
            Catch ex As Exception
                'MessageBox.Show(ex.ToString)
                'LocalError("FormFx1Load")
            End Try
    
        End Sub
    Per avviare questa routine però vorrei utilizzare un thread in modo da poter essere subito pronto per la vendita successiva senza dover aspettare l'invio della mail.
    Il codice per avviare il Thread è il seguente:

    codice:
    MsgBox("Avvio del thread")
    Dim T As New Threading.Thread(AddressOf InviaMailFidelizzazione)
    T.Start()
    MsgBox("Thread avviato correttamente")
    Il problema è che non vengono eseguite tutte le operazioni indicate nella routine.
    In termini di msgbox vengono visualizzati solo i seguenti:

    1.MsgBox("Avvio del thread")
    2.MsgBox("Thread avviato correttamente")
    3.MsgBox("Inizio delle operazioni del thread")

    Secondo voi dove sbaglio?

    Grazie per l'attenzione

  2. #2
    Ciao Marco.
    Se scommenti i messagebox dopo i Catch o ci aggiungi :
    codice:
    Messagebox.Show(ex.message)
    ti accorgi subito dell'errore causato dalla dichiarazione nella prima riga.....con il quale otterrai un eccezione crossthread

    Facci sapere....
    Ciao

  3. #3
    L'errore individuato è il seguente:

    Testo dell'errore:
    Prima di effettuare chiamate OLE, occorre impostare il thread corrente sulla modalità Single Thread Apartment (STA). Assicurarsi che la funzione Main sia contrassegnata con STAThreadAttribute.

    Ricercando su Msdn qui ho capito il problema e l'ho risolto
    ma non ho ancora capito una cosa:

    Come mai nella routine avviata nel Thread c'e contenuto un riferimento ad un valore recuperato mendiante la proprietà Text di una label di un'altro form
    codice:
    Form18.Label21.Text
    Come mai questo valore non viene recuperato?
    Per risolvere ho dovuto passarglielo attraverso una variabile al livello form assegnata prima dell'avvio del thread.

  4. #4
    Come mai questo valore non viene recuperato?
    Perchè hai bisogno di un delegate che si occupi recuperare quel valore che 'appartiene' ad un oggetto il quale è occupato/gestito da un thread diverso(quello prinicipale).

    Ciao

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.