我要写一些统计资料以文本文件的每一次一个人负载一页。但是每隔一段时间我正在不能打开文件,已经在使用'类型的错误。我可不是100%复制这种错误是非常不稳定。我的代码

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

我的问题是,怎么可能我锁的文件,使我停止越来越不稳定的错误?

感谢

有帮助吗?

解决方案

您必须处理异常,并建立一些处理,以重新尝试短随机间隔后写入文件。

如果你得到太多的竞争,那么它可能更有意义,它记录到一个数据库表中,并创建一个过程来导出到文件(如果仍然需要)

其他提示

如果两个或更多的请求你的web服务器在大致相同的时间,他们都会尝试打开相同的文件。你需要为每个请求创建唯一的文件名。

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

三个重要的事情:

  1. 使用的IO.文件共享.读写,以允许多个作家在该文件上一次。
  2. 所使用的语句,以确保流是立即关闭,即使发生异常。这将最大限度地减少碰撞
  3. 该TextWriterTraceListener将创建一个临时文件对你的如果它不能公开的文件的请求,以确保消息不会丢失。

我还没有与短信息使用任何麻烦: File.AppendAllText(路径,信息);

关于从反射器,它使用相同的选项由Joel很好的解释使锁在其上的评论,。它不使用跟踪写入器,所以不会输出到一个临时文件中高负荷的情况下/大含量造成麻烦。

如果该信息是很大,你真的想单独的文件。对于高负载,我会去与乔尔的建议,并创建一个临时文件,可以通过捕捉在File.AppendAllText例外,而且使用相同的File.AppeandAllText一个文件名唯一可替代地进行。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top