以下代码用于登录今天的文件“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")
答案 0 :(得分: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,在该对象上执行对文件的写入或使日志文件具有时间特定以避免此类问题