0

下面的代码用于今天登录文件“Service.27082012.txt”。

Private filePath As String
Private fileStream As FileStream
Private streamWriter As StreamWriter

Public Sub OpenFile()
    Dim strPath As String
    strPath = "Service." & Format(Now, "ddMMyyyy") & ".txt"
    If System.IO.File.Exists(strPath) Then
        fileStream = New FileStream(strPath, FileMode.Append, FileAccess.Write)
    Else
        fileStream = New FileStream(strPath, FileMode.Create, FileAccess.Write)
    End If
    streamWriter = New StreamWriter(fileStream)
End Sub

Public Sub WriteLog(ByVal strComments As String)
    OpenFile()
    streamWriter.WriteLine(strComments)
    CloseFile()
End Sub

Public Sub CloseFile()
    streamWriter.Close()
    fileStream.Close()
End Sub

但是当我尝试通过 Writelog 异步写入日志文件时,我得到了错误

该进程无法访问文件“D:\Temp\Service.27082012.txt”,因为它正被另一个进程使用。

如何摆脱它。

异常堆栈跟踪是:

at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy, Boolean useLongPath)
at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access)
at Calc.Service.OpenFile() in D:\Project\Service.svc.vb:line 784
at Calc.Service.WriteLog(String strComments) in D:\Project\Service.svc.vb:line 791
at Calc.Service.GetInfo(DetailsRequest request) in D:\Project\Service.svc.vb:line 759
at SyncInvokeGetInfo(Object , Object[] , Object[] )
at System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke(Object instance, Object[] inputs, Object[]& outputs)
at System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc& rpc)
at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc& rpc)
at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage41(MessageRpc& rpc)
at System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet)

日志被异步写入文件,如下所示

Dim multiThreadOptions As ParallelOptions = New ParallelOptions
multiThreadOptions.MaxDegreeOfParallelism = 16
Parallel.For(0, 100, multiThreadOptions, Function(i)
                                                 Dim objServiceCall As New ServiceCall
                                                 synw.WriteLine("{0} ", objServiceCall.MethodCall(TextBox1.Text, TextBox2.Text))
                                                 synw.Flush()
                                                 Return i
                                             End Function)

MethodCall 包含 Writelog 的代码

Writelog("Comments")
4

1 回答 1

1

请使用 SyncLock 来避免如上所述的跨线程问题。请在下面找到示例代码:

Dim multiThreadOptions As ParallelOptions = New ParallelOptions
multiThreadOptions.MaxDegreeOfParallelism = 16
Parallel.For(0, 100, multiThreadOptions, Function(i)
                                                 Dim objServiceCall As New ServiceCall
                                                 SyncLock synw
                                                 synw.WriteLine("{0} ", objServiceCall.MethodCall(TextBox1.Text, TextBox2.Text))
                                                 synw.Flush()
                                                 End SyncLock
                                                 Return i
                                             End Function)

此外,您正在写入特定日期的文件,因此如果您在同一时间点收到多个调用,那么您将尝试访问同一个文件,因此您可能会遇到该异常。尝试在您正在执行写入文件的 streamWriter 对象上使用 syncLock 或使日志文件具有特定时间以避免此类问题

于 2012-08-28T08:43:20.777 回答