C#
 Computer >> コンピューター >  >> プログラミング >> C#

C#でStringCollectionへの同期アクセスを取得する方法

C#のStringCollectionクラスは、System.Collections.Specialized名前空間に属する文字列専用のコレクションです。マルチスレッド環境下でコレクションに安全にアクセスするには、SyncRootプロパティとlockステートメントを組み合わせて、同期(排他制御)されたアクセスを行います。

ここでは、StringCollectionへの同期アクセスを取得する具体的なコード例を2つ紹介します。

例1:SyncRootプロパティを使った同期アクセス

using System;
using System.Collections.Specialized;
public class Demo {
    public static void Main() {
        StringCollection stringCol = new StringCollection();
        String[] arr = new String[] { "100", "200", "300", "400", "500" };
        Console.WriteLine("Array elements...");
        foreach (string res in arr) {
            Console.WriteLine(res);
        }
        stringCol.AddRange(arr);
        Console.WriteLine("Total number of elements = " + stringCol.Count);
        stringCol.RemoveAt(3);
        Console.WriteLine("Total number of elements now = " + stringCol.Count);
        Console.WriteLine("Synchronize access...");
        lock(stringCol.SyncRoot) {
            foreach(object ob in stringCol) {
                Console.WriteLine(ob);
            }
        }
    }
}

出力結果

上記のコードを実行すると、次のような出力が得られます。

Array elements...
100
200
300
400
500
Total number of elements = 5
Total number of elements now = 4
Synchronize access...
100
200
300
500

コードの解説

この例では、まず配列の全要素をAddRangeメソッドでStringCollectionに一括追加しています。次に、RemoveAt(3)によってインデックス3の要素「400」を削除し、要素数が5から4に変化したことを確認できます。

その後、lockステートメント内でstringCol.SyncRootをロックすることにより、他のスレッドから同時にアクセスされることなく、コレクションの内容を安全に列挙(foreach処理)できるようになります。

例2:文字列を個別に追加して同期アクセスする

続いて、Addメソッドで文字列を1件ずつ追加した場合の例を見てみましょう。

using System;
using System.Collections.Specialized;
public class Demo {
    public static void Main() {
        StringCollection strCol = new StringCollection();
        strCol.Add("Katie");
        strCol.Add("Philips");
        strCol.Add("Jacob");
        strCol.Add("Carl");
        strCol.Add("Gary");
        Console.WriteLine("Synchronize access...");
        lock(strCol.SyncRoot) {
            foreach(object ob in strCol) {
                Console.WriteLine(ob);
            }
        }
    }
}

出力結果

上記のコードを実行すると、次のような出力が得られます。

Synchronize access...
Katie
Philips
Jacob
Carl
Gary

ポイントまとめ

  • SyncRootプロパティ: コレクションへの同期アクセスに使用できるオブジェクトを返します。
  • lockステートメント: SyncRootをロックすることで、複数スレッドからの同時アクセスによる競合を防ぎます。
  • 列挙時の注意点: foreachによる列挙中にコレクションが変更されると例外が発生するため、読み取り処理も必ずロック内で行うことが推奨されます。
  1. C#でタプルの6番目の要素を取得する方法【Item6プロパティの使い方】

    C#のタプル(Tuple)から6番目の要素を取得するには、Item6プロパティを使用します。System名前空間のTupleクラスは、Item1からItem7までの読み取り専用プロパティを持っており、それぞれ対応する位置の要素にアクセスできます。 例1:Item6プロパティで6番目の要素を取得する 次のコードでは、Tuple.Createメソッドで7つの要素を持つタプルを2つ作成し、Equalsメソッドによる等価性の確認、GetHashCodeメソッドによるハッシュコードの取得を行った後、Item6プロパティで6番目の要素を取り出しています。 using System; public clas

  2. C#の2次元配列から要素にアクセスする方法を徹底解説

    2次元配列は、x個の行とy個の列を持つ「表(テーブル)」としてイメージすると理解しやすくなります。2次元配列の要素へアクセスするには、添字(インデックス)を使用します。具体的には、配列の行インデックスと列インデックスを指定します。int x = a[1,1]; Console.WriteLine(x);C#では、カンマで区切って a[行, 列] の形式で記述することにより、任意の位置にある要素を取得できます。上記の例では、1行1列の位置にある要素を変数 x に代入し、コンソールに出力しています。サンプルコード以下の例では、5行2列の2次元配列を作成し、入れ子になったforループですべての要素を