Accès à la BDD dans un background worker fait freezer le thread principal
Bonjour,
J'ai un processus qui prend du temps (une grosse requête sur une base Access), du coup je me suis dit que j'allais threader ce processus, afin de ne pas bloquer l'interface (la requête est assez lourde et peut prendre jusqu'a 30 secondes pour s'éxecuter.
J'ai donc essayé d'utiliser un backgroundworker, mais lorsque celui-ci fait l'accès à la BDD, l'écran se freeze le temps de l'execution de la requête. Ma question est donc : mais que se passe-t'il ? est-ce normal ? si non, avez-vous des idées pour résoudre ce problème qui va me rendre chèvre ? Merci d'avance pour vos contributions !
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| Public Class ctlSessionResultat
...
Private WithEvents mbgw As BackgroundWorker
...
Private Sub ctlSessionResultat_Load(sender As Object, e As EventArgs) Handles Me.Load
mbgw = New BackgroundWorker() With {.WorkerReportsProgress = True, .WorkerSupportsCancellation = True}
If Not mbgw.IsBusy Then mbgw.RunWorkerAsync()
End Sub
Private Sub mbgw_DoWork(sender As Object, e As DoWorkEventArgs) Handles mbgw.DoWork
Dim _RechercheLines(37, 0) As String
Dim strSql As String = "SELECT * from Table1"
Dim strSql2 As String = "SELECT * from Table2"
Dim ligne As Long = 0
Dim myDataset As New DataSet("myDataset")
Dim totalLine As Long = 0
Dim dt As DataTable
'chargement des datatables avec les données pour la recherche
For Each qry As String In {strSql, strSql2}
dt = New DataTable()
Dim da As New OleDbDataAdapter(qry, "Provider=Microsoft.ACE.OLEDB.12.0;Data source=c:\maBDD.mdb")
da.Fill(dt)
totalLine += dt.Rows.Count
myDataset.Tables.Add(dt)
Next
'redimensionne le tableau avec les elements de recherche
ReDim _RechercheLines(nbColRecherche - 1, totalLine)
'Remplissage du tableau
For Each dt In myDataset.Tables
For Each r As DataRow In dt.Rows
For i = 0 To dt.Columns.Count - 1
If r(i) IsNot DBNull.Value Then _RechercheLines(i, ligne) = r(i)
Next
ligne += 1
Next
Next
e.result = _RechercheLines
End Sub
End Class |
Petites précisions :
Mon code se situe dans un contrôle utilisateur qui se situe lui-même dans une DLL
J'utilise Office 2016 (32 bits)
VS 2015
framework 4