IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Forms Discussion :

contextSwitchDeadlock a ete detecte


Sujet :

Windows Forms

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 89
    Par défaut contextSwitchDeadlock a ete detecte
    Bonjour,

    Je réalise un programme qui me permet de parcourir un repertoire et de recuperer tous les fichiers texte.

    Pour chaque fichier texte je verifie si c'est un fichier original ou un fichier que j'ai modifier si c'est un original je le modifie en faisant un traitement sur chaque ligne.
    Tous les fichiers sont ensuite integrer dans ma table ligneTransaction à l'aide d'un "bulk insert".

    Pour un repertoire qui represente un trimestre de l'annee je recupere 880 000 lignes.

    Malheureusement le processus qui me permet de faire cela s'arrete en plein milieu et m'affiche cette erreur :

    ContextSwitchDeadLock a été détecté

    Le CLR n'a pas pu effectuer de transition du contexte COM 0x10ba008 au contexte COM 0x10ba178 pendant 60 secondes. Le thread qui possède le contexte/cloisonnement de destination est probablement en train d'attendre ou de traiter une opération très longue sans pompage des messages Windows. Cette situation a généralement des effets négatifs sur les performances et peut parfois entraîner le blocage de l'application ou une utilisation ininterrompue de la mémoire.
    Voici une partie de mon code :


    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
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
     
     
    Public Sub integrerFichier(ByVal s As String) ' Fonction qui me permet de traiter un fichier
     
            Dim myLines() As String
            Dim continuFichier As Boolean = True
            Dim continuFile As Boolean = True
            Dim codeUNI As String
            Dim i As Int32
     
            Dim nombre As Int64
            Dim sqlSelect As String
            Dim ligne As String
            Dim newLigne As String
            Dim l As Int32 = 0
            Dim ElementBis() As String
     
            Try
                Dim fi As FileInfo
                fi = New FileInfo(s)
                Dim Element() As String = fi.Name.Split(".")
                codeUNI = Element(2)
     
                myLines = File.ReadAllLines(s)
     
                If (myLines.Length > 1) Then
     
                    nbLigne = nbLigne + 1
                    ligne = myLines(1)
                    If (ligne.Length <= 40) Then
                        i = 1
     
                        Do
                            ligne = myLines(i)
     
                            integrerLigne(ligne, codeUNI)
                            myLines(i - 1) = ligne
                            i = i + 1
     
                        Loop While (i < myLines.Length)
     
     
                        Dim sw As StreamWriter
                        sw = New StreamWriter(s)
     
                        Do
                            newLigne = myLines(l)
                            sw.WriteLine(newLigne)
                            l = l + 1
                        Loop While (l < myLines.Length - 1)
                        sw.Close()
     
                    End If
     
     
                End If
     
                If (myLines(0).Length < 50) Then
                    ElementBis = myLines(0).Split(";")
                    sqlSelect = "SELECT count(*) FROM ligne where codeUNI = '" & codeUNI & "'  and datepart(yy,dateTransaction) = datepart(yy, '" & Date.Parse(ElementBis(1)) & "') and datepart(mm,dateTransaction) = datepart(mm,'" & Date.Parse(ElementBis(1)) & "') and datepart(dd,dateTransaction) = datepart(dd,'" & Date.Parse(ElementBis(1)) & "') and IdMachine = " & CInt(ElementBis(0)) & " and nbDossiers = " & CInt(ElementBis(5)) & " and datepart(mi,heure) = datepart(mi,'" & Date.Parse(ElementBis(2)) & "') and datepart(hh,heure) = datepart(hh,'" & Date.Parse(ElementBis(2)) & "') and decision = '" & ElementBis(3) & "' and codeModePaiement = '" & ElementBis(4) & "' and sommeTransaction =  " & ElementBis(6)
     
                    Dim CommandSQL As New SqlCommand(sqlSelect, con)
     
                    nombre = CommandSQL.ExecuteScalar
                    If (nombre = 0) Then
     
                        Dim sqlString As String = "BULK INSERT ligne FROM " & "'" & s & "'" & " WITH (FIELDTERMINATOR = ';', ROWTERMINATOR = '\n');"
                        Dim com As New SqlCommand(sqlString, con)
                        com.ExecuteNonQuery()
     
                    End If
                End If
     
     
            Catch ex As Exception
     
                MsgBox("bulk: " & ex.Message)
     
            End Try
     
     
        End Sub
     
     
    Public Function integrerLigne(ByRef maligne As String, ByVal pointVente As String)  ' Fonction qui permet de modifier une ligne de mon fichier original 
     
            Dim continuLigne As Boolean = True
     
     
            Dim p As Char = "."
            Dim v As Char = ","
            Dim pv As Char = ";"
            Dim e As Char = " "
            Dim th As Int16
            Dim tm As Int16
     
            Try
                Dim ElementBis() As String = maligne.Split(";")
     
     
                If (ElementBis(2).Length = 8) Then
                    If (ElementBis(6).Contains(v)) Then
                        ElementBis(6).Replace(v, p)
                    End If
     
                    Dim h As String = ElementBis(2).Substring(4, 4).Insert(2, ":")
                    th = trancheHoraire(h)
                    tm = typeMachine(ElementBis(0))
     
                    maligne = ElementBis(0) & ";" & ElementBis(1) & ";" & h & ";" & ElementBis(3) & ";" & ElementBis(4) & ";" & ElementBis(5) & ";" & ElementBis(6) & ";" & pointVente & ";" & th.ToString & ";" & tm.ToString
     
                End If
     
     
            Catch ex As Exception
                MsgBox("ligne non valide" + "  " + pointVente + " " & nbLigne)
            End Try
     
     
        End Function
    Merci d'avance

  2. #2
    Membre chevronné Avatar de Redouane
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    435
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2003
    Messages : 435
    Par défaut
    Bonjour,

    Essaye de travailler avec le modèle de programmation asynchrone APM, ça te permet d’effectuer des traitements dans un thread sans pour autant bloquer les autres threads, voir l'article :

    http://msdn.microsoft.com/fr-fr/libr...69(VS.80).aspx

    t'auras à faire qlq chose comme suite :

    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
     
     '' il faut créer un délégue AsynIntegrerFichier qui a la même signature que la méthode
    '' integrerFichier et qui possède un paramètre
    Public Delegate Sub AsynIntegrerFichier(ByVal s As String)
     
    '.................
    ' et dans le code où tu appel ta méthode, tu mets :
     
    Dim appelIntegrerFichier As AsynIntegrerFichier = New AsynIntegrerFichier(AddressOf integrerFichier)
     
    '' BeginInvoke utilise les mêmes paramètres que la méthode appelée suivit de
    '' deux paramètres optionnels :
    '' - Un délégué AsyncCallback qui pointe sur une méthode à appeler lorsque l’appel
    ''   asynchrone se termine.
    '' - Un objet qui vous permet de passer des données à la méthode exécutée par le délégué.
    ''   Ici ils seront Nothing
    Dim Resultat As IAsyncResult = appelIntegrerFichier.BeginInvoke(s, Nothing, Nothing) 's etant le parametre que tu passe dans ta méthode integrerFichier
     
    '' La méthode EndInvoke permet de fermer l’appel à la méthode
    appelIntegrerFichier.EndInvoke(Resultat)
    Bonne courage

  3. #3
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    ou utiliser un backgroundworker
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 89
    Par défaut
    J'ai ajoute application.DoEvents sur chacune de mes boucles et je n'ai plus d'erreur.

    Merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Detection des touches enfoncées par API
    Par Ingham dans le forum VB 6 et antérieur
    Réponses: 31
    Dernier message: 20/02/2006, 12h30
  2. Virus detecté au demarrage
    Par Nasky dans le forum Sécurité
    Réponses: 7
    Dernier message: 26/11/2002, 23h07
  3. [VB6] [Lecteur] Détection de disquette
    Par oazar dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 31/10/2002, 12h37
  4. detection de lignes
    Par the.cable.guy dans le forum Algorithmes et structures de données
    Réponses: 29
    Dernier message: 10/10/2002, 11h15
  5. Detection arret de windows
    Par philippe30 dans le forum API, COM et SDKs
    Réponses: 4
    Dernier message: 21/09/2002, 18h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo