Newsgroup: it.comp.lang.visual-basic
Titolo: [VB 2010 Ex] BackgroundWorker.

Ciao a tutti,
sto provando ad usare questo componente, ma mi dà risultati inaspettati.
"Connessione" è una Var pubblica, dichiarata ad inizio modulo.
 
    Private Sub backgroundWorker1_DoWork(ByVal sender As Object, ByVal e As DoWorkEventArgs) Handles BackgroundWorker1.DoWork
        Dim strSql As String = "SELECT IDEditori, Editore FROM Editori ORDER BY Editore"
        Dim da As New OleDbDataAdapter(strSql, Connessione)
        Dim dt As New DataTable()
 
        da.Fill(dt)
 
        With ComboBox2
            .DataSource = dt
            .DisplayMember = "Editore"
            .ValueMember = "IDEditori"
        End With
 
    End Sub
 
    Private Sub BackgroundWorker1_RunWorkerCompleted(sender As System.Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
 
        MessageBox.Show(ComboBox2.Items.Count)
 
    End Sub
 
 
La combo risulta vuota, benchè restituisca il n° di record esatti, ma soprattutto impiega molto tempo (come se non uscisse da un loop), mentre da verifica dovrebbe impiegare solo qualche decimo di secondo.
Probabilmente non ho compreso il funzionamento di questo componente.
Grazie.

 Probabilmente non ho compreso il funzionamento di questo componente.
 
stai riempiendo la combo dal thread sbagliato, devi farlo nell'evento 
"completed", oppure fare una chiamata verso il thread principale usando 
un sistema di sincronizzazione come ISynchronizeInvoke, che in Windows 
Forms è implementato da tutti i controlli.
 
.m
 
-- 
blog @ //
milestone.topics.it
 
 
 


Ciao Mauro,
avevo provato a fare come da te suggerito:
 
Private Sub BackgroundWorker1_RunWorkerCompleted(sender As System.Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
 
        With ComboBox2
            .DataSource = dt
            .DisplayMember = "Editore"
            .ValueMember = "IDEditori"
        End With
 
End Sub
 
Ma la DataTable "dt" come la passo?
E' corretto allocarla in una Var pubblica?
Grazie.

Di nuovo grazie Mauro, ho risolto dichiarando nel modulo una variabile:
 
    Dim dtMaster As New DataTable
 
    Private Sub Ricerche_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
 
        BackgroundWorker1.RunWorkerAsync() 'lancio il BGW
 
    End Sub
 
    Private Sub backgroundWorker1_DoWork(ByVal sender As Object, ByVal e As DoWorkEventArgs) Handles BackgroundWorker1.DoWork
 
        Dim strSql As String = "SELECT IDEditori, Editore FROM Editori ORDER BY Editore"
        Dim da As New OleDbDataAdapter(strSql, Connessione)
        Dim dt As New DataTable()
 
        da.Fill(dtMaster)
 
    End Sub
 
    Private Sub BackgroundWorker1_RunWorkerCompleted(sender As System.Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
 
        With ComboBox2
            .DataSource = dtMaster
            .DisplayMember = "Editore"
            .ValueMember = "IDEditori"
        End With
 
    End Sub
 
'Ora vorrei gestire una ProgressBar:
 
    Private Sub BackgroundWorker1_ProgressChanged(sender As System.Object, e As System.ComponentModel.ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged
 
        Me.ProgressBar1.Value = e.ProgressPercentage
 
    End Sub
 
 
Non funziona!

 Non funziona!
 
Stesso problema ProgressChanged viene scateneto in un thread diverso da 
quello della UI, non puoi accedere ai controlli visuali, devi passare 
da ISynchronizeInvoke.


 da ISynchronizeInvoke.
Credevo di aver risolto (sembra funzionare) con:
 
    Private Sub BackgroundWorker1_DoWork(sender As System.Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
 
        BackgroundWorker1.ReportProgress(100)' Mauro, ho inserito questo 
        Me.MagazzinoTableAdapter.Fill(Me.GommistaDataSet.Magazzino)
 
    End Sub
 
Lo avevo trovato in un esempio: è un caso che mi funzioni?..
Ad ogni modo mi studio ciò che mi hai indicato.
Di nuovo grazie :)

 Di nuovo grazie :)
