Frage

Ich mag einige Statistiken in eine Textdatei eine Person jedes Mal schreiben, eine Seite lädt. Aber jeder einmal in eine Weile ich bin immer ‚Datei konnte nicht geöffnet, bereits in Verwendung‘ Art des Fehlers. Ich kann nicht zu 100% replizieren diese Fehler es ist sehr unberechenbar. Mein Code ist

Public Sub WriteStats(ByVal ad_id As Integer)
    Dim ad_date As String = Now.Year & Now.Month

    Dim FILENAME As String = Server.MapPath("text/BoxedAds.txt")
    Dim objStreamWriter As StreamWriter
    objStreamWriter = File.AppendText(FILENAME)
    objStreamWriter.WriteLine(ad_id & ";" & ad_date)
    objStreamWriter.Close()
End Sub

Meine Frage ist, wie kann ich die Datei sperren und entsperren, damit ich die erratische Fehler stoppen bekommen?

Danke

War es hilfreich?

Lösung

Du musst die Ausnahme behandeln und einige Handhabung baut erneut versuchen, nach einem kurzen zufälligen Intervall in die Datei zu schreiben.

Wenn Sie zu viel Konkurrenz bekommen, dann könnte es sinnvoller, es melden sich an einem Tisch in einer Datenbank machen und einen Prozess erstellen, um eine Datei zu exportieren (wenn seine nach wie vor erforderlich)

Andere Tipps

Wenn zwei oder mehr Anfragen treffen Ihre Webserver in etwa zur gleichen Zeit, werden sie alle versuchen, die gleiche Datei zu öffnen. Sie müssen für jede Anforderung eindeutige Dateinamen erstellen.

Public Sub WriteStats(ByVal ad_id As Integer)
    Dim ad_date As String = Now.Year & Now.Month
    Dim FILENAME As String = Server.MapPath("text/BoxedAds.txt")
    Dim index As Integer

    Using fs As New IO.FileStream(FILENAME, IO.FileMode.Append, IO.FileAccess.Write, IO.FileShare.ReadWrite), _
          tl As New TextWriterTraceListener(fs)

        index = Trace.Listeners.Add(tl)
        Trace.WriteLine(ad_id & ";" & ad_date)
        Trace.Listeners(index).Flush()
        Trace.Flush()
    End Using
    Trace.Listeners.RemoveAt(index)
End Sub

Drei wichtige Dinge hier:

  1. Die Verwendung von IO.FileShare.ReadWrite zu auf einmal mehr Autoren, die über die Datei nicht gestattet.
  2. Die Anweisung um sicherzustellen, dass der Strom sofort geschlossen wird, auch wenn eine Ausnahme auftritt. Dies minimiert Kollisionen
  3. Die Textwritertracelistener wird eine temporäre Datei für Ihre erstellen, wenn die Datei nicht öffnen können Sie, fordern die Nachricht, um sicherzustellen, nicht verloren geht.

Ich habe keine Probleme mit Kurzinfo mit hatte: File.AppendAllText (path, info);

In Bezug auf den Kommentar auf sie verursacht Schlösser, aus Reflektor es den gleichen Optionen verwendet von Joel sehr gut erklärt. Es verwendet nicht das Trace-Writer, so wird es nicht Ausgabe in eine temporären Datei im Fall hoher Last / hohe Gehalt Probleme verursacht.

Wenn die Info groß ist, wollen Sie wirklich separate Dateien. Für hohe Belastung, würde ich mit Joel Vorschlag gehen und eine temporäre Datei erstellen, die alternativ durch den Fang die Ausnahme auf File.AppendAllText getan werden kann, und den gleichen File.AppeandAllText mit einem eindeutigen Dateinamen verwendet wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top