запись в файл в многопоточном приложении не удалась vb.net - PullRequest
2 голосов
/ 11 июля 2011

У меня есть многопоточное приложение, которое записывает журнал в файл. иногда сохранение не удается с помощью этого кода

Friend Sub SaveToText(ByVal FileName As String, ByVal Text As String)
        '// create a writer and open the file
        Dim objLock As New Object
        SyncLock objLock

            Dim tw As TextWriter = Nothing
            Try
                '// write a line of text to the file
                tw = New StreamWriter(FileName, True)
                tw.Write(Text)
            Catch ex As Exception
                MessageBox.Show(ex.Message, "Error saving", _
                                MessageBoxButtons.OK, _
                                MessageBoxIcon.Error)
            Finally
                '// close the stream
                If tw IsNot Nothing Then
                    tw.Close()
                    tw.Dispose()
                End If

            End Try
        End SyncLock
    End Sub

Сообщение об ошибке я получаю

Процесс не может получить доступ к файлу error.log, потому что он используется другим процессом.

Каким другим способом я могу сделать это безопасным?

1 Ответ

6 голосов
/ 12 июля 2011
    Dim objLock As New Object

Ваш оператор SyncLock ничего не блокирует. Каждый поток получает свой собственный экземпляр objLock, поскольку он является локальной переменной и распределяется каждый раз при входе в метод. Переместите объявление за пределы метода, чтобы оно стало членом вашего класса. И убедитесь, что есть только один экземпляр этого класса. Или сделайте это Shared ReadOnly.

...