有问题开写入文本的文件ASP.NET
-
11-07-2019 - |
题
我要写一些统计资料以文本文件的每一次一个人负载一页。但是每隔一段时间我正在不能打开文件,已经在使用'类型的错误。我可不是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
三个重要的事情:
- 使用的IO.文件共享.读写,以允许多个作家在该文件上一次。
- 所使用的语句,以确保流是立即关闭,即使发生异常。这将最大限度地减少碰撞
- 该TextWriterTraceListener将创建一个临时文件对你的如果它不能公开的文件的请求,以确保消息不会丢失。
我还没有与短信息使用任何麻烦: File.AppendAllText(路径,信息);
关于从反射器,它使用相同的选项由Joel很好的解释使锁在其上的评论,。它不使用跟踪写入器,所以不会输出到一个临时文件中高负荷的情况下/大含量造成麻烦。
如果该信息是很大,你真的想单独的文件。对于高负载,我会去与乔尔的建议,并创建一个临时文件,可以通过捕捉在File.AppendAllText例外,而且使用相同的File.AppeandAllText一个文件名唯一可替代地进行。
不隶属于 StackOverflow