2012-04-12 6 views
0

サービスの開始時にデータをロードするスレッドがあります。このスレッドでParallel.Foreachを使用して一連のデータを反復するメソッドを呼び出します。しかし、私は並列forerachの中にあるlinqクエリは、インスタンスエラーに設定されていないobjet参照を取得します。Parallel.Foreachをスレッド内で使用する

* 私もParallel.Foreachを削除する場合は、私はスレッドを削除する場合と同じロジックが働きます。 * リストをロックすることさえ役立たない。 **

loadingThread = new Thread(new ThreadStart(PreloadData)); 
       loadingThread.IsBackground = true; 
       loadingThread.Start(); 
--------------------------------------- 

    public static void PreloadData() 
    { 
    Parallel.ForEach(loadedIDs.Keys, indexDefId => 
        { 
         List<FixingEvent> lst = null; 
         lock (loadedEvents) 
         { 
          lst = (from e in loadedEvents where e.DIVACode.Equals(indexDefId) select e).ToList(); 
         } 

--------------------------- 
    } 

私は内部のLINQクエリで例外を取得 - 'eはnullであるので、参照エラーオブジェクトのを。

何か助けていただければ幸いです。

+1

あなたのコードに 'loadedEvents'が設定されていますか?その変数はnullであり、原因はもっと詳しく知る必要があります。 – yamen

+0

これは、スレッドが開始される前であっても事前に計算されています。私はこれを二重にチェックし、完全に入力され、ヌル値を持たない。実際には、スレッドから呼び出さないと同じコードが正常に動作します。 –

+0

スレッドの外でコードを開始するときに、コード内の正確に同じ場所で呼び出しますか? – yamen

答えて

0

私は、リストloadedEventsがnull要素が含まれていると思います。多分競合状態のためです。

+0

私のコメントを参照してください。 –

+0

私は答えとしてこれを受け入れます。なぜなら、何らかの理由でそれがうまく動作するからです。しかし、まだ、別のスレッドを使わずに実行した場合、nullチェックなしでなぜこれが機能するのか分かりません。私はまた、いくつかの競合状態を疑う。 –

0

あなたはloadedEventsオブジェクトをロックするべきではありません。 msdnによると:

ベストプラクティスすべてのインスタンスに共通のデータを保護するためにロックオンするプライベートオブジェクト、またはプライベート 静的オブジェクト変数を定義することです。

アクセスしているオブジェクトをロックする必要はありません。ロックするオブジェクトが必要です。

+0

チップのおかげで。しかし残念ながら、問題はそうではありません。どういうわけか、スレッドでparallel.foreachを呼び出すと、null参照エラーが発生します。 –

関連する問題