Bonjour tout le monde,

J'ai un soucis avec l'utilisation du BackgroundWorker (VB.net et base de données Access 2003). Dans mon formulaire principal (Form5) j'ai un bouton dont l'évènement click contient 'Form7.ShowDialog()' qui appelle mon formulaire secondaire. Dans ce formulaire, je fais le code suivant:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
Public Class Form7
 
    Private Sub Form7_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Me.Text = Version
        BackgroundWorker1.RunWorkerAsync()
    End Sub
 
    Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
        Dim Criteria As String = ""
        Dim Token As Boolean = False
 
        If Form5.TextBox5.TextLength + Form5.TextBox7.TextLength + Form5.TextBox8.TextLength + Form5.TextBox9.TextLength + Form5.TextBox2.TextLength + Form5.TextBox3.TextLength > 0 Then
            Criteria = " WHERE "
        End If
        If Form5.TextBox5.TextLength > 0 Then
            Criteria = Criteria & "title1 LIKE '%" & Form5.TextBox5.Text.ToString & "%'"
            Token = True
        End If
        If Form5.TextBox7.TextLength > 0 Then
            If Token Then Criteria = Criteria & " AND "
            Criteria = Criteria & "title3 LIKE '%" & Form5.TextBox7.Text.ToString & "%'"
            Token = True
        End If
        If Form5.TextBox8.TextLength > 0 Then
            If Token Then Criteria = Criteria & " AND "
            Criteria = Criteria & "title4 LIKE '%" & Form5.TextBox8.Text.ToString & "%'"
            Token = True
        End If
        If Form5.TextBox9.TextLength > 0 Then
            If Token Then Criteria = Criteria & " AND "
            Criteria = Criteria & "title5 LIKE '%" & Form5.TextBox9.Text.ToString & "%'"
            Token = True
        End If
        If Form5.TextBox2.TextLength > 0 Then
            If Token Then Criteria = Criteria & " AND "
            Criteria = Criteria & "title6 LIKE '%" & Form5.TextBox2.Text.ToString & "%'"
            Token = True
        End If
        If Form5.TextBox3.TextLength > 0 Then
            If Token Then Criteria = Criteria & " AND "
            Criteria = Criteria & "title7 LIKE '%" & Form5.TextBox3.Text.ToString & "%'"
        End If
 
        Form5.DataGridView1.DataSource = Access("SELECT title1, title2, title3, title4, title5, title6, title7 FROM table" & Criteria, "table").Tables("table")
 
        Form5.DataGridView1.Columns(0).HeaderText = "Title1"
        Form5.DataGridView1.Columns(1).HeaderText = "Title2"
        Form5.DataGridView1.Columns(2).HeaderText = "Title3"
        Form5.DataGridView1.Columns(3).HeaderText = "Title4"
        Form5.DataGridView1.Columns(4).HeaderText = "Title5"
        Form5.DataGridView1.Columns(5).HeaderText = "Title6"
        Form5.DataGridView1.Columns(6).HeaderText = "Title7"
    End Sub
 
    Private Sub BackgroundWorker1_RunWorkerCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
        Me.Close()
    End Sub
End Class
Avec la fonction 'Access' (qui fonctionne sans problème):

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
    Public Function Access(ByVal RequeteSQL As String, ByVal Table As String) As DataSet
        Dim MyAdapter As OleDbDataAdapter= New OleDbDataAdapter(RequeteSQL, MyConnection)
 
        Try
            MyDataSetTemp.Clear()
            MyAdapter.Fill(MyDataSetTemp, Table)
            'A ce niveau les données résultantes de la requete se trouvent dans => MyDataSet.Tables(0)
        Catch ex As Exception
            MessageBox.Show("Failed to connect to database! " & ex.Message)
        End Try
        Return MyDataSetTemp
        MyDataSetTemp.Clear()
    End Function
La ligne
Code : Sélectionner tout - Visualiser dans une fenêtre à part
Form5.DataGridView1.DataSource = Access("SELECT title1, title2, title3, title4, title5, title6, title7 FROM table" & Criteria, "table").Tables("table")
dure normalement plus de 2 minutes si Criteria = "" (table contient plus de 115000 records), j'ai donc mis sur mon formulaire secondaire une progressbar en mode 'Marquee'. Sans le BackgroundWorker la progressbar ne fonctionne pas et l'exception 'contextswitchdeadlock' est parfois levée. Avec le BackgroundWorker, la progressbar fonctionne, il n'y a plus d'exception et le traitement ne dure que quelques secondes. Mais mon 'Form5.DataGridView1' reste désespérément vide.

Help me please.