.net – 在SyncLock块中放置频繁的文件I / O操作是不是一个坏主意?

我有一些代码可以做到这一点:

Public Function AppendToLogFile(ByVal s As String) As Boolean
    Dim success As Boolean = True
    Dim fs As IO.FileStream = nothing
    Dim sw As IO.StreamWriter = nothing

    Static LogFileLock As New Object()
    SyncLock LogFileLock
        Try
            fs = New IO.FileStream(LogFilePath)
            sw = New IO.StreamWriter(fs)
            sw.WriteLine(s)

        Catch ex As Exception
            success = False

        Finally
            If Not sw Is nothing Then sw.Close()
            If Not fs Is nothing Then fs.Close()
        End Try
    End SyncLock

    Return success
End Function

首先:我在SyncLock中有Try / Catch / Finally块是一个问题吗?

第二个:假设这个代码一个事件上运行,可能在很短的时间内运行很多次 – 比如说,在一秒钟内运行十次.让它像这样的SyncLock是否可以,或者让它在队列中添加一行更有意义,然后将所有行从队列写入到计时器上的文件,例如,每秒一次?

解决方法

乍一看,这看起来还不错,有两点需要注意:

>静态成员已在幕后使用一种线程安全锁定.因此,您可能只需要在现有锁上捎带,而不是显式锁定.不过,我不确定那会是什么样子.
>不要返回状态代码.让异常传播到适当的级别.完成后,您可以像这样重写代码

.

Public Sub AppendToLogFile(ByVal s As String) As Boolean
    Static LogFileLock As New Object()
    SyncLock LogFileLock
        Using sw As New IO.StreamWriter(LogFilePath)
            sw.WriteLine(s)
        End Using
    End SyncLock
End Sub

这只是不到一半代码的所有功能.唯一的区别是你必须在调用代码中处理异常而不是检查返回状态.

相关文章

Format[$] ( expr [ , fmt ] ) format 返回变体型 format$ 强...
VB6或者ASP 格式化时间为 MM/dd/yyyy 格式,竟然没有好的办...
在项目中添加如下代码:新建窗口来显示异常信息。 Namespace...
转了这一篇文章,原来一直想用C#做k3的插件开发,vb没有C#用...
Sub 分列() ‘以空格为分隔符,连续空格只算1个。对所选...
  窗体代码 1 Private Sub Text1_OLEDragDrop(Data As Dat...