sto utilizzando il BacgroundWorker(BW) per eseguire una query molto pesante con un datareader
lo scenario è questo:
dichiaro il datareader(myReader) a livello di form
nell'evento DoWork del BW eseguo la query (tralascio il codice precedente per la valorizazione delle proprieta de BW e la chiamata all'esecuzione asincrona)
codice:
Private Sub AsincTask_DoWork(ByVal sender As Object, ByVal e As DoWorkEventArgs)
sql = "SELECT molto pesante..."
Dim comm As New OleDbCommand
comm.Connection = connessione
comm.CommandText = sql
myReader = comm.ExecuteReader
End Sub
la conclusione dell'operazione che mi veiene notificata attraverso l'evento RunWorkerCompleted nel quale
dovrei popolare una listbox con il risultato della query
codice:
Private Sub AsincTask_RunWorkerCompleted(ByVal sender As Object, ByVal e As RunWorkerCompletedEventArgs)
While myReader.Read()
lstBatchDaImportare.Items.Add(myReader.Item(0).ToString)
End While
myReader.Close()
MessageBox.Show("caricamento terminato")
End Sub
ottengo questo errore:
System.Reflection.TargetInvocationException non è stata gestita
Message="Eccezione generata dalla destinazione di una chiamata."
nel punto all'interno del ciclo quando tento di popolare la listbox
per quello che ne so non si puo accedere ad elementi di un tread da
un'altro tread, ma il backgroundworker consente di farlo al temine dell'operazione asincrona
proprio nell'evento RunWorkerCompleted o sbaglio?
Naturalmente non utilizzando in BW e facendo eseguire tutto in sequenza il codice postato funziona regolarmente
come posso fare?