-1

同時にいくつかのスレッドによって呼び出される WriteMsg という名前のメソッドがありますが、例外 java.nio.channels.OverlappingFileLockExceptionが発生しています。どうすればこれを解決できますか? 私のコードは以下のように似ています。

public void WriteMsg(string Msg)
{
    Mutex objMutex = new Mutex(false, "ThreadLock");
    objMutex.WaitOne(); 
    using (StreamWriter sw = new StreamWriter(sPathName, true))
    {
        sw.WriteLine(Msg);
        sw.Flush();
        sw.Close();
    }
    objMutex.ReleaseMutex();
    objMutex.Close();
}
4

4 に答える 4

0

一度に 1 つのスレッドを許可するようにこのメソッドをマークしてもよろしいですか? その後、前の呼び出しが終了すると、次の呼び出しが行われます。

この属性をクラスに追加します。

[MethodImpl(MethodImplOptions.Synchronized)]

そして using ステートメント:

using System.Runtime.CompilerServices;
于 2012-05-09T06:40:49.710 に答える
0

ああ、あなたは自分が何語を使っているかさえ知りませんか?

コードは C# とマークされています。エラー メッセージは... java.nio.channels.OverlappingFileLockException です。何を推測してください-JavaはC#ではありません。Yopur のコードは C# ですが、例外は Java です。ここですべてのストーリーが見られるわけではないと強く思います。C# コードは Java 例外をスローしません。

とにかく、要点は - 単に複数のスレッドから同時に同じファイルにアクセスしないでください。これは、ある種のロックメカニズムを意味します。Mutex を使用したアプローチは賢明に聞こえます (しかし、CLELARY がコードで C# を使用している場合、Java はゲームにどのように登場しますか?) 私は ProcessExplorer の使用を開始し、何がファイルをロックしているのかを調べます。それは作家ではないのでしょうか?READS とは別のものなのでしょうか? それがプロセス外か何かである場合、Mutex は役に立ちません。待機 + 再試行を伴う try / catch が可能です。

それは言った:

ミューテックスを確認してください。メソッドでミューテックスを作成します。THE WaitOne は決して待ちません。メソッド呼び出し間で Mutex を維持し、すべての呼び出しで同じ Mutex が使用されるようにする必要があります。今は「一番小さい番号しか入れない」って言ってるけど、同じ番号のチケットをみんなに配る。Mutex はすべての呼び出し元で共有する必要があるため、メソッド内で定義することはできません。クラスの設計に応じて、インスタンス変数、静的変数、ディクショナリ opf ミューテックス (パスでキー指定) が必要です。

于 2012-05-09T06:42:42.753 に答える
0

1) すべての呼び出しを順番に実行したいだけだと仮定するとWriteMsg、Mutex をいじる必要はなく、andlockへの呼び出しをラップする C# のステートメントを使用するだけで済みます。Monitor.EnterMonitor.Exit

2) usingStreamWriter で使用しているため、手動でフラッシュして閉じる必要はありません。

したがって、メソッドは次のようになります。

private object _lockObject = new object(); // shared by all threads.
public void WriteMsg(string Msg)
{
     lock (_lockObject)
     {
        using (StreamWriter sw = new StreamWriter(sPathName, true))
        {
            sw.WriteLine(Msg);
        }

     }
}
于 2012-05-09T06:44:54.430 に答える
0

Mutexこの関数を呼び出すたびに新しいを作成するポイントは何ですか? 各スレッドは単独で...すべてのスレッドで共有してMutexください。Mutex

于 2012-05-09T06:45:11.990 に答える