0

多数のクライアント アプリケーションが .Net リモート処理を使用して接続するプロキシ プロセスがあります。参照カウント方式を使用して、このプロキシの存在を管理したいと思います。これを行うには、次のようなキーと値 (string-int) のペアを格納する小さなメモリ マップ ファイルを使用すると考えました。

ref_count 2

ただし、ref_count 値を時々更新したいのですが、そうするのに問題があります。これが私のコードです:

using System;
using System.IO;
using System.IO.MemoryMappedFiles;
using System.Threading;

class Program
{
    static void Main(string[] args)
    {
        using (MemoryMappedFile mmf = MemoryMappedFile.CreateNew("testmap", 100))
        {
            bool mutexCreated;
            Mutex mutex = new Mutex(true, "testmapmutex", out mutexCreated);
            using (MemoryMappedViewStream stream = mmf.CreateViewStream())
            {
                BinaryWriter writer = new BinaryWriter(stream);
                writer.Write("count:");
                writer.Write(3);
            }
            mutex.ReleaseMutex();

            mutex.WaitOne();
            using (MemoryMappedViewStream stream = mmf.CreateViewStream())
            {
                BinaryReader reader = new BinaryReader(stream);
                BinaryWriter writer = new BinaryWriter(stream);

                Console.WriteLine("String value is: {0}", reader.ReadString()); 
                Console.WriteLine("UInt32 value is: {0}", reader.ReadUInt32()); 

                // Update mmf data
                writer.Write("count:");
                writer.Write(30);

                // empty string where "count" was expected
                Console.WriteLine("String value is: {0}", reader.ReadString());
                // 0 where 30 was expected
                Console.WriteLine("UInt32 value is: {0}", reader.ReadUInt32()); 
            }
            mutex.ReleaseMutex();
        }
    }
}

それで、私の質問は、参照カウントを更新する最良の方法は何ですか?また、上記のコード例で2番目の書き込みが機能しないのはなぜですか?

ありがとう、

4

2 に答える 2

1

ストリームです。したがって、それから読み取ると、位置が進みます。追加する必要があります

  stream.Position = 0;

カウントを更新するコードとそれを再度読み取るコードの両方の前。文字列を書かないことでさらに改善します。必要ありません。

于 2012-05-22T03:56:50.407 に答える
1

2番目の書き込み呼び出しは機能しますが、「間違った」場所から書き込み/読み取りを行っています。

これがすべて完了したら、メモリに次のものが必要です。

5 ("code:" の長さ) "code:" ("code:" の実際の文字) 3 (書き込み/読み取り値) 5 ("code:" の長さ) "code:" (" code:") 30 (書き込んだ値) 0 (読み取った空文字列の長さ) 0 (読み取った値)

BinaryReader/BinaryWriter メソッドのいずれかを呼び出すたびに、基になる Stream が進められます。メモリ マップされたファイルのビューで新しいストリームを構築したため、初めて機能します (したがって、ストリームをリセットします)。書き込みと読み取りの間に stream.Seek(0L, SeekOrigin.Begin) を呼び出して、何が起こるかを確認してみてください。

于 2012-05-22T04:07:55.517 に答える