2009-03-12 17 views
3

人がページを読み込むたびにテキストファイルにいくつかの統計情報を書きたいと思っています。しかし、しばらくして、「ファイルを開くことができませんでした、既に使用中です」タイプのエラーが発生しています。私はこのエラーを100%複製することはできません。非常に不安定です。私のコードは、私がどのようにロックし、私は不安定なエラーが発生して停止するようにファイルのロックを解除することができ、ASP.NETでのテキストファイルのオープン/書き込みに問題がある

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 

私の質問があるのですか?

おかげ

答えて

1

あなたは、例外を処理し、再試行してください短いランダム間隔の後、ファイルへの書き込みをするためにいくつかの処理を構築する必要があります。

あなたはあまりにも多くの競合を取得した場合、それはデータベースのテーブルにそれを記録し、(そのはまだ必要であれば)ファイルにエクスポートするプロセスを作成するために、より多くの意味をなすかもしれない

+0

私はときどきデータベースにどれくらい大きな負担がかかりますか?ページあたり20回までファイルに書き込む必要がありますか? – pixeldev

4

2つの以上の要求がほぼ同時刻にWebサーバーをヒットした場合、それらはすべて同じファイルを開こうとします。要求ごとに一意のファイル名を作成する必要があります。

+0

は、実際には:各セッションは、おそらく十分です。単一のユーザーが多数の同時リクエストを作成することはほとんどありません。 –

0

私がいずれかを持っていませんでした短い情報のトラブル: File.AppendAllText(path、info);ロックを引き起こし、それにコメントについて

は、反射板からそれは同じオプションがジョエルによって非常によく説明し使用しています。トレースライタを使用していないので、負荷が大きい場合や大量のコンテンツが問題を起こした場合には一時ファイルに出力されません。

情報が大きい場合は、あなたが本当に別々のファイルにしたいです。高負荷の場合、私はJoelの提案に行き、Tempファイルを作成します。これは、File.AppendAllTextの例外をキャッチし、同じFile.AppeandAllTextを一意のファイル名で使用することで行うことができます。ここ

+0

それはまだロックすることができます:私はそれを見ました。 –

+0

あなたは確かですか?これは生産上のものであり、そのための単一のログエントリではありません。私が言ったように、小さなビットの情報 – eglasius

+0

@Joelリフレクターで適切なオプションを使用することを確認しました。 (私は生産上のログエントリを言っていないので、そうは思わない) – eglasius

4
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 

3つの重要な事柄:一度ファイルに複数の作家を許可するIO.FileShare.ReadWriteの

  1. 使用。
  2. Usingステートメントは、例外が発生した場合でもストリームがすぐに閉じられることを確認します。これは、衝突
  3. それはあなたが要求したファイルを開くことができない場合は、TextWriterTraceListenerは確認メッセージが失われないようにするために、あなたのための一時ファイルを作成しますを最小限に抑えることができます。
+0

ジョエル、シンプルFile.AppendAllTextはまさにそのとき(リフレクターに確認してください) – eglasius

+0

私はそれを行う必要があるでしょうが、私は上記の言ったようにカスタムソリューションで行くする必要はありません:私はFile.AppendAllTextがロックを取得見てきました。 –

+0

あなたの解決策もありますが、代わりの解決策が必要だと思います/私の取り組みは、アプローチに関係なく負荷に問題を与える情報ではないことです。 – eglasius

関連する問題