1

私は現在Mutexを使用して、プロセス間でファイルへの同期アクセスを確立しています。

//Process 1
//High frequency "writes"
try
{
    mutex.WaitOne(System.Threading.Timeout.Infinite);

    try
    {
        //Do write operation

    }
    finally
    {
        mutex.ReleaseMutex();
    }
}
catch(AbandonedMutexException)
{
    //Log error
}

次に、ファイルに何が書き込まれたかを確認する必要がある場合があります。

//Process 2
//Low frequency "reads"
try
{
    mutex.WaitOne(System.Threading.Timeout.Infinite);

    try
    {
        //Do read operation

    }
    finally
    {
        mutex.ReleaseMutex();
    }
}
catch(AbandonedMutexException)
{
    //Log error
}

しかし、この手法で起こるProcess 2ことは、低頻度の「読み取り」を行っている がハングアップしたように見え、リソースへのアクセスをまったく受け取らないか、そうするのに時間がかかりすぎる可能性があるということです。

私の状況で使用するより良いロックはありますか?

PS。プロセス間で使用するには互換性が必要です。

4

2 に答える 2

1

イベントを導入して修正したと思います:

EventWaitHandle event = new EventWaitHandle(true, 
     EventResetMode.ManualReset, 
     strEventGlobalName,     //Must be the same for each process
     out dummy, 
     eventSecurity);         //To allow access between processes

したがって、ライターは次のようになります。

//Process 1
//High frequency "writes"

//Wait to allow writing
if (event.WaitOne(System.Threading.Timeout.Infinite))
{
    try
    {
        mutex.WaitOne(System.Threading.Timeout.Infinite);

        try
        {
            //Do write operation

        }
        finally
        {
            mutex.ReleaseMutex();
        }
    }
    catch(AbandonedMutexException)
    {
        //Log error
    }
}

読者は次のようになります。

//Process 2
//Low frequency "reads"

try
{
    //Reset event to halt writing
    if (!event.Reset())
        throw new Exception("Did not reset event");

    try
    {
        mutex.WaitOne(System.Threading.Timeout.Infinite);

        try
        {
            //Do read operation

        }
        finally
        {
            mutex.ReleaseMutex();
        }
    }
    catch(AbandonedMutexException)
    {
        //Log error
    }
}
finally
{
    //Set event to allow back writing
    if(!event.Set())
        throw new Exception("Did not set event");
}
于 2013-05-27T23:04:42.683 に答える
0

このような名前付きミューテックスを使用していますか?:

bool created = false;       
string mutexHandle = "SOME_UNIQUE_ENOUGH_STRING_slkuhfwer7487rctcwf6gt86efcwwgsa";
var myFileLock = new Mutex(true, mutexHandle, out created);

システム レベルでプロセス間でタスクを同期するために使用できるのは、名前付きミューテックスのみだからです。

もしそうなら、あなたは(技術的に)正しいことをしています。

ただし、一方の端で高周波操作を実行している場合。Thread.Sleep(1);以前のようなギャップmutex.WaitOne(System.Threading.Timeout.Infinite);をライターに提供する必要があります(たとえば)。または、メモリ マップド ファイルのような別のアプローチを使用するか、新しいタグ付きファイルに書き込む (名前にタイムスタンプを付けて読み取りファイルを削除する) か、ファイルのバージョン管理を提供するツールを使用する必要があります。

于 2013-05-27T20:13:42.550 に答える