Streamwriter close fige le programme

VbNicoG Messages postés 127 Date d'inscription vendredi 27 juin 2008 Statut Membre Dernière intervention 6 septembre 2019 - 29 août 2019 à 10:13
vb95 Messages postés 3406 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 20 mars 2023 - 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
--

4 réponses

Whismeril Messages postés 18289 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 23 mars 2023 622
29 août 2019 à 15:07
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
0
vb95 Messages postés 3406 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 20 mars 2023 165
Modifié le 30 août 2019 à 17:37
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)


0
VbNicoG Messages postés 127 Date d'inscription vendredi 27 juin 2008 Statut Membre Dernière intervention 6 septembre 2019
6 sept. 2019 à 09:15
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.
--
0
vb95 Messages postés 3406 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 20 mars 2023 165
Modifié le 6 sept. 2019 à 10:28
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



0
Rejoignez-nous