4

ユーザーがアプリケーションを使用するときに、ユーザーごとにアプリケーション内のいくつかの変数のユーザー名、時間、および古い/変更された値を書き込む監査ファイルを作成しています。FileStreamおよびを使用してStreamWriter、監査ファイルにアクセスしています。各ユーザーのすべての監査は、同じファイルに書き込まれます。

問題は、2 人のユーザーがこの監査ファイルを同時に更新している場合、各変数の「古い値」がユーザー間で混同されることです。これはなぜですか?また、ここで同時実行性の問題をどのように解決できますか?

簡潔にするために短縮されたいくつかのコード...

Dim fs As FileStream
Dim w As StreamWriter

Public Sub WriteAudit(ByVal filename As String, ByVal username As String, ByVal oldAddress As String, ByVal newAddress As String, ByVal oldCity As String, ByVal newCity As String)
    Dim now As DateTime = DateTime.Now
    Dim audit As String = ""
    audit += now + "," + username + "," + oldAddress + "," + newAddress + "," + oldCity + "," + newCity

    fs = New FileStream(filename, FileMode.Append)
    w = New StreamWriter(fs)
    w.WriteLine(audit)
    w.Close()
    fs.Close()
End Sub

これは、インスタンス変数を介して参照される AuditLogger クラスに存在します (関数がアクセスされるたびに再割り当てされます)。

4

3 に答える 3

2

あなたはこれを試すかもしれません:

TextWriter tw = TextWriter.Synchronized(File.AppendText(filePath));

File.AppendText() メソッドは StreamWriter オブジェクトを返します。これを TextWriter.Synchronized() メソッドがラップして、StreamWriter と同じように使用できるスレッドセーフな TextWriter を作成します。

于 2009-12-10T18:16:15.477 に答える
2

AuditLogger毎回クラスの新しいインスタンスを作成する必要がないように、アプリケーションをリファクタリングします。シングルトン パターンを直接使用するか、依存性注入フレームワークを使用して、アプリケーション全体で同じインスタンスを使用します。

そこから、実装ははるかに簡単になります。書き込み操作をlockステートメントで囲むかTextWriter.Synchronized、ロバートの回答で言及されているように使用します。

この投稿は関連があるかもしれません:

于 2009-12-10T19:03:09.987 に答える
0

いくつかの方法:

まず、ファイルではなく共有データベースを使用します。単純なアクセス データベースでも、複数のユーザーをディスク上のファイルよりもはるかに適切に処理できます。

次に、ユーザーごとに個別のファイルを使用できますか? 多分それを %APPDATA% フォルダに保存しますか? それともどこかのネットワーク共有でしょうか?

于 2009-12-10T17:35:21.630 に答える