0

毎秒継続的に更新される配列リストがあります。他の 2 つのスレッドで同じ配列リストを使用し、そのローカル コピーを作成する必要があります。これをすべて実行しましたが、 index out of bound の奇妙な例外が発生します。これまでにわかったことは、配列リストを複数のスレッドで使用するための同期メカニズムを確保する必要があることです。

これは私がそれを同期させる方法です:

for (int i = 0; i < Globls.iterationCount; i++)
            {
                if (bw_Obj.CancellationPending)
                {
                    eve.Cancel = true;
                    break;
                }

                byte[] rawData4 = DMM4.IO.Read(4 * numReadings);
                TempDisplayData_DMM4.Add(rawData4);
                Globls.Display_DataDMM4 = ArrayList.Synchronized(TempDisplayData_DMM4);
                Globls.Write_DataDMM4 = ArrayList.Synchronized(TempDisplayData_DMM4);

            }

他のスレッドでは、次のようにしてローカル コピーを作成します。

ArrayList Local_Write_DMM4 = new ArrayList();
Local_Write_DMM4 = new ArrayList(Globls.Write_DataDMM4); 

arraylist を正しい方法で同期していますか? また、array-list のコピー中にロックする必要がありますか?

 lock (Globls.Display_DataDMM4.SyncRoot){Local_Temp_Display1 = new ArrayList(Globls.Display_DataDMM4);}

または単一の操作では安全ですか?私は実際にこのコードを実行していません。週末に実行する必要があり、別の例外を見たくありません:(.これについて私を助けてください!

4

2 に答える 2

2

@Trickeryが述べたように、ソース配列Globls.Write_DataDMM4は列挙中に別のスレッドによって変更される可能性があるため、割り当てをロックする必要があります。したがって、元の配列を作成するときとコピーを作成するときの両方をロックすることが不可欠です

for (int i = 0; i < Globls.iterationCount; i++)
{
    if (bw_Obj.CancellationPending)
    {
        eve.Cancel = true;
        break;
    }

    byte[] rawData4 = DMM4.IO.Read(4 * numReadings);
    TempDisplayData_DMM4.Add(rawData4);

    lock (Globls.Display_DataDMM4.SyncRoot)
    {
    Globls.Write_DataDMM4 = ArrayList.Synchronized(TempDisplayData_DMM4);
    }

}

lock (Globls.Display_DataDMM4.SyncRoot)
{
     Local_Temp_Display1 = new ArrayList(Globls.Display_DataDMM4);
}
于 2012-09-21T13:51:54.127 に答える
1

はい、ArrayList に対するすべての操作で Lock を使用する必要があります。

編集: 申し訳ありませんが、このサイトでは何らかの理由であなたの質問にコメントを追加できません。

于 2012-09-21T12:43:03.667 に答える