none
多线程写文件 RRS feed

  • 问题

  • 如何多线程调用下面的方法不产生冲突
      Private Sub WriteEmailTxt(ByVal email As String)

         
            Dim fs As New FileStream(Application.StartupPath & "\email.txt", FileMode.OpenOrCreate, FileAccess.Write)
            Dim m_streamWriter As New StreamWriter(fs)
            m_streamWriter.BaseStream.Seek(0, SeekOrigin.[End])
            m_streamWriter.WriteLine(email)
            m_streamWriter.Flush()
            m_streamWriter.Close()
            fs.Close()

        End Sub

    2009年10月13日 1:19

答案

  • 你好 可以添加个lock

    Private Shared ReadOnly Property InternalSyncObject As Object
        Get
            If (s_InternalSyncObject Is Nothing) Then
                Dim obj2 As New Object
                Interlocked.CompareExchange((s_InternalSyncObject), obj2, Nothing)
            End If
            Return s_InternalSyncObject
        End Get
    End Property
    Dim s_InternalSyncObject As Object
    Private Sub WriteEmailTxt(ByVal email As String)

          SyncLock InternalSyncObject
            Dim fs As New FileStream(Application.StartupPath & "\email.txt", FileMode.OpenOrCreate, FileAccess.Write)
            Dim m_streamWriter As New StreamWriter(fs)
            m_streamWriter.BaseStream.Seek(0, SeekOrigin.[End])
            m_streamWriter.WriteLine(email)
            m_streamWriter.Flush()
            m_streamWriter.Close()
            fs.Close()

    End SyncLock
        End Sub


    Wenn ich dich hab’,gibt es nichts, was unerträglich ist.坚持不懈!http://hi.baidu.com/1987raymond
    2009年10月13日 1:38
    版主
  • 版主的代码不能解决问题啊,仍然显示错误,正在被另一进程使用?
    你好!
         如果是“正在被另一进程使用”,那不是线程的问题,而是进程的问题!
         说明有其他程序正在使用这个资源,你检查一下!
    周雪峰
    2009年10月13日 5:25
    版主

全部回复

  • Private syncRoot As Object = New [Object]()
    Private Sub WriteEmailTxt(ByVal email As String)
        SyncLock syncRoot
            Dim fs As New FileStream(Application.StartupPath & "\email.txt", FileMode.OpenOrCreate, FileAccess.Write)
            Dim m_streamWriter As New StreamWriter(fs)
            m_streamWriter.BaseStream.Seek(0, SeekOrigin.[End])
            m_streamWriter.WriteLine(email)
            m_streamWriter.Flush()
            m_streamWriter.Close()
           
            fs.Close()
        End SyncLock
    End Sub

    知识改变命运,奋斗成就人生!
    2009年10月13日 1:33
    版主
  • 你好 可以添加个lock

    Private Shared ReadOnly Property InternalSyncObject As Object
        Get
            If (s_InternalSyncObject Is Nothing) Then
                Dim obj2 As New Object
                Interlocked.CompareExchange((s_InternalSyncObject), obj2, Nothing)
            End If
            Return s_InternalSyncObject
        End Get
    End Property
    Dim s_InternalSyncObject As Object
    Private Sub WriteEmailTxt(ByVal email As String)

          SyncLock InternalSyncObject
            Dim fs As New FileStream(Application.StartupPath & "\email.txt", FileMode.OpenOrCreate, FileAccess.Write)
            Dim m_streamWriter As New StreamWriter(fs)
            m_streamWriter.BaseStream.Seek(0, SeekOrigin.[End])
            m_streamWriter.WriteLine(email)
            m_streamWriter.Flush()
            m_streamWriter.Close()
            fs.Close()

    End SyncLock
        End Sub


    Wenn ich dich hab’,gibt es nichts, was unerträglich ist.坚持不懈!http://hi.baidu.com/1987raymond
    2009年10月13日 1:38
    版主
  • 版主的代码好像有点问题吧,
    2009年10月13日 1:56
  • 版主的代码不能解决问题啊,仍然显示错误,正在被另一进程使用?
    2009年10月13日 1:58
  • 你好!

    出现这种情况的原因是因为你在另外的代码里对 email.txt 进行了读写,并且没有加锁

    知识改变命运,奋斗成就人生!
    2009年10月13日 2:20
    版主
  • 版主的代码不能解决问题啊,仍然显示错误,正在被另一进程使用?
    你好!
         如果是“正在被另一进程使用”,那不是线程的问题,而是进程的问题!
         说明有其他程序正在使用这个资源,你检查一下!
    周雪峰
    2009年10月13日 5:25
    版主