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 に答える