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();
編集
言い換えれば、なぜ私はこのブレークポイントに到達するのですか?
カウンターが問題だと思ったのですが、セマフォに何か問題があるのかもしれません...