0

XMLに似た大きなテキストを解析する必要があります。テキストがメモリにないため(私はStreamReaderオブジェクトを持っています)、そのストリームをメモリに配置するのが最も時間がかかる場所です。したがって、1つのスレッドで、そのストリームを配列(メモリ)に配置します。そして、その配列を処理する別のスレッドがあります。しかし、私は奇妙な振る舞いをしています。たとえば、次の画像を見てください。

ここに画像の説明を入力してください

それに注意してください、listToProcess[counter] = buffer そして今それはそうあるべきですlistToProcess[10] = bufferデバッガがそのlistToProcess[10]=null理由を言っていることに注意してください!?。もう一方のスレッドは、アイテムを読み取るだけで、変更はしません。最初は、他のスレッドがそのitem = nullを作成しているのではないかと思いましたが、そうではありません。なぜ私はこの振る舞いを経験しているのですか?


ここに私のコードを見たい場合は、次のとおりです。

        Semaphore sem = new Semaphore(0, 1000000);
        bool w;
        bool done = false;

        // this task is responsible for parsing text created by main thread. Main thread
        // reads text from the stream and places chunks in listToProces[]
        var task1 = Task.Factory.StartNew(() =>
        {
            sem.WaitOne(); // wait so there are items on list (listToProcess) to work with                
                                // counter to identify which chunk of char[] in listToProcess we are ading to the dictionary
                int indexOnList = 0;

                while (true)
                {
                    if (listToProcess[indexOnList] == null)
                    {
                        if (done)
                            break;

                        w = true;
                        sem.WaitOne();
                        w = false;



                        if (done)
                            break;

                        if (listToProcess[indexOnList] == null)
                        {
                            throw new NotFiniteNumberException();
                        }
                    }

                    // add chunk to dictionary
                    ProcessChunk(listToProcess[indexOnList]);

                    indexOnList++;
                }

        }); // close task1

        bool releaseSem = false;

        // this main thread is responsible for placing the streamreader into chunks of char[] so that
        // task1 can start processing those chunks
        int counter = 0;
        while (true)
        {
            char[] buffer = new char[2048];

            // unparsedDebugInfo is a streamReader object
            var charsRead = unparsedDebugInfo.Read(buffer, 0, buffer.Length);

            if (charsRead < 1)
            {
                listToProcess[counter] = pattern;
                break;
            }

            listToProcess[counter] = buffer;
            counter++;

            if (releaseSem)
            {
                sem.Release();
                releaseSem = false;
            }

            if (counter == 10 || w)
            {
                releaseSem = true;
            }
        }

        done = true;

        sem.Release();
       task1.Wait();

編集

言い換えれば、なぜ私はこのブレークポイントに到達するのですか?

ここに画像の説明を入力してください

カウンターが問題だと思ったのですが、セマフォに何か問題があるのか​​もしれません...

4

1 に答える 1

7

その前にcounter++更新したのはインデックス10ではなくインデックス9でした。

意味:それが設定したというあなたの主張

listToProcess[10] = buffer:

正しくありません:設定しました

listToProcess[9] = buffer:
于 2012-07-11T16:04:22.537 に答える