Streamwriter close fige le programme

Messages postés
127
Date d'inscription
vendredi 27 juin 2008
Statut
Membre
Dernière intervention
6 septembre 2019
- - Dernière réponse : vb95
Messages postés
1979
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
5 décembre 2019
- 6 sept. 2019 à 10:02
Bonjour,

J'avais un problème il y a quelques mois, mon programme se figeait sur la méthode flush d'un streamwriter. On m'avait alors conseiller de supprimer cette méthode et de faire la méthode close directement. C'est dans le post suivant :
https://codes-sources.commentcamarche.net/forum/affich-10095267-streamwriter-flush-fige-mon-programme

Malheureusement, cela n'a en fait pas résolu le problème, mon programme se fige à présent sur la méthode close. C'est très pénalisant pour mon application car elle peut parfois se figer jusqu'à 15 secondes.

Quelqu'un aurait eu une idée pour corriger ce problème ?
Merci d'avance
--
Afficher la suite 

4 réponses

Messages postés
14026
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
6 décembre 2019
322
0
Merci
Bonjour
Et en utilisant AppendAllText à la place de AppendText
https://docs.microsoft.com/fr-fr/dotnet/api/system.io.file.appendalltext?view=netframework-4.8
Commenter la réponse de Whismeril
Messages postés
1979
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
5 décembre 2019
77
0
Merci
bonjour à vous deux
A l'époque j'avais donné ce bout de code
Private Sub SaveRecord()
      Dim stp, KeyHisNum As String
      Dim ss As StreamWriter
      ' Pause record during shift historical
      If Not gPauseRecord Then
             Try
                    ' Write record point
                    NumberRecord = NumberRecord + 1
                    KeyHisNum = KEY_RECORD & NumberRecord.ToString
                    stp = NumberRecord.ToString & LIST_SEPARATOR
                    stp &= Historical_V3.EncodeOneRecord_V3(HistoricalFields, True)
                    ss = File.AppendText(FullFileName)
                    ss.WriteLine(KeyHisNum & "=" & stp)
             Catch ex As Exception
                    AuditTrail_WriteEvent("ERR,Failed to log history record." & FullFileName)
             Finally
                    ss.Close()
             End Try
        End If

    End Sub


Or en regardant de plus prêt à la méthode File.AppendText on s'apperçoit que celle-ci à 2 paramètres
1) le fichier ou ajouter du texte
2) le texte à ajouter

Le code suivant modifié donne-t-il satisfaction ?
Private Sub SaveRecord()
      Dim stp, KeyHisNum As String
      Dim ss As StreamWriter
      ' Pause record during shift historical
      If Not gPauseRecord Then
             Try
                    ' Write record point
                    NumberRecord = NumberRecord + 1
                    KeyHisNum = KEY_RECORD & NumberRecord.ToString
                    stp = NumberRecord.ToString & LIST_SEPARATOR
                    stp &= Historical_V3.EncodeOneRecord_V3(HistoricalFields, True)
                    ss = File.AppendText(FullFileName, KeyHisNum & "=" & stp)
                    ss.Close()
              Catch ex As Exception
                    AuditTrail_WriteEvent("ERR,Failed to log history record." & FullFileName)
                    If ss <> Nothing Then ss.Close()
             End Try
        End If

    End Sub


Attention : peut-être faut-il rajouter un
Environment.NewLine
à la fin du fichier pour passer la ligne ajoutée en début d'une nouvelle ligne
ss = File.AppendText(FullFileName, Environment.Newline & KeyHisNum & "=" & stp)


Commenter la réponse de vb95
Messages postés
127
Date d'inscription
vendredi 27 juin 2008
Statut
Membre
Dernière intervention
6 septembre 2019
0
Merci
Bonjour,

Merci de vos réponses.

Pour répondre à Whismeril, je ne sais pas pourquoi mais AppendTextAll ne fonctionne pas, rien ne s'écrit dans le fichier. Peut être parce que je suis limité à l'utilisation du framework 3.5 ?
Voici comment je l'utilise :

		Try
			' Pause record during shift historical
			If Not gPauseRecord Then
				' Write record point
				NumberRecord = NumberRecord + 1
				KeyHisNum = KEY_RECORD & NumberRecord.ToString
				stp = NumberRecord.ToString & LIST_SEPARATOR
				stp &= Historical_V3.EncodeOneRecord_V3(HistoricalFieldsWrite, False)

                                File.AppendTextAll(FullFileName, KeyHisNum & "=" & stp)
			End If
		Catch ex As Exception
			AuditTrail_WriteEvent("ERR,Failed to log history record." & FullFileName)
		End Try


Sinon, pour répondre à Vb95, ta modification est effectivement plus propre mais elle n'a pas résolue le fait que mon programme se fige sur la méthode "close" du streamwriter.

D'autres idées ?
Merci à tous les 2.
--
Commenter la réponse de VbNicoG
Messages postés
1979
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
5 décembre 2019
77
0
Merci
Bonjour

AppendTextAll s'applique pourtant bien au FrameWork 3.5
Attention le fichier ne doit pas être ouvert

Sinon teste ce code
Private Sub SaveRecord()
      Dim stp, KeyHisNum As String
      ' Pause record during shift historical
      If Not gPauseRecord Then
             Dim ss As StreamWriter = New StreamWriter(FullFileName)
             Try
                    ' Write record point
                    NumberRecord = NumberRecord + 1
                    KeyHisNum = KEY_RECORD & NumberRecord.ToString
                    stp = NumberRecord.ToString & LIST_SEPARATOR
                    stp &= Historical_V3.EncodeOneRecord_V3(HistoricalFields, True)
                    ss = File.AppendText(FullFileName, KeyHisNum & "=" & stp)
              Catch ex As Exception
                    AuditTrail_WriteEvent("ERR,Failed to log history record." & FullFileName)
              End Try
              If ss isNot Nothing 
                   ss.Dispose() ' libère les ressources du StreamWriter
                   ss.Close() ' ferme le StreamWriter
              End if
        End If

    End Sub



Commenter la réponse de vb95