0

文字列配列を2つに分割し、2つのスレッドを作成して、それらの2つのスレッドでそれらの配列を検索しようとしています。スレッドを正しく作成していて、検索機能は正しいことはわかっていますが、それでも次のエラーが発生します。

System.NullReferenceException was unhandled
Object reference not set to an instance of an object.

コードは次のとおりです。

// Create first and second array:
string[] firstarray = pieces.Take(pieces.Length / 2).ToArray();
string[] secondarray = pieces.Skip(pieces.Length / 2).ToArray();
string[] results = new string[pieces.Length];
string inputword = textBox5.Text.Trim();

ManualResetEvent[] calls = new ManualResetEvent[2];
calls[0] = new ManualResetEvent(false);
calls[1] = new ManualResetEvent(false);

// Set 2 new threads:
ThreadPool.QueueUserWorkItem((t) => {
    // SearchThruPieces searches an array for a string and returns the items
    // that contains the string
    // SearchThruPieces(string[] pieces, string word);
    SearchThruPieces(firstarray, inputword).CopyTo(results, 0);
    calls[0].Set();
});

ThreadPool.QueueUserWorkItem((t) => {
    SearchThruPieces(secondarray, inputword).CopyTo(results, firstarray.Length);
    calls[1].Set();
});

WaitHandle.WaitAll(calls);
string firststring = results[0]; // This line throws an exception

SearchThruPiecesこれで、次のコマンドを使用したときに発生するため、このエラーはスレッドやメソッドのいずれにも関係しないことがわかりました。

results[0]

エラーを返します。

私がこの問題を解決するのを手伝ってください、または彼らが私が達成しようとしていることをするためのより良い方法であるかどうか教えてください。

ありがとう

編集:

SearchThruPiecesのコードは次のとおりです。

delegate string[] Search(string[] pieces, string word);

        static Search SearchThruPieces = (string[] pieces, string word) =>
        {
            object locker = new object();
            lock (locker)
            {
                int a = 0;
                string[] afterpieces = new string[pieces.Length];
                for (int b = 0; b < (pieces.Length / 4); b++)
                {
                    if (pieces[a].Trim().ToLower().Contains(word.Trim().ToLower()) && pieces[a].Trim().Length > 0)
                    {
                        afterpieces[a] = pieces[a].Trim();
                        afterpieces[a + 1] = pieces[a + 1].Trim();
                        afterpieces[a + 2] = pieces[a + 2].Trim();
                        afterpieces[a + 3] = pieces[a + 3].Trim();
                    }

                    a += 4;
                }
                return afterpieces;
            }
        };

編集2:

だから私はブレークポイントを設定しました:

afterpieces[a] = pieces[a].Trim();

それが呼び出されるかどうかを確認します。このエラーは、results[]をの結果に設定することに関係していると思いますSearchThruPieces

4

1 に答える 1

0

pieces要素が定義されていると仮定piecesし、検索している文字列が実際ににあると仮定し、検索文字列が実際にsecondarray配列分割後にあると仮定すると、2番目の呼び出しが再び渡さresultsれるため、は空になります。ThreadPoolfirstarraysecondarray

于 2012-05-28T10:57:51.260 に答える