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

C#でSortedListオブジェクトの同期ラッパーを作成する方法

C#のSortedListオブジェクトに対してスレッドセーフな同期ラッパーを作成するには、静的メソッドSortedList.Synchronized()を使用します。このメソッドは、元のSortedListをラップした同期済み(スレッドセーフ)の新しいSortedListインスタンスを返します。

同期ラッパーが作成されたかどうかは、IsSynchronizedプロパティで確認できます。このプロパティがTrueを返せば、そのコレクションへのアクセスは同期されていることを意味します。

例1:Synchronized()メソッドで同期ラッパーを作成する

以下のコードでは、まず通常のSortedListを作成し、その後Synchronized()メソッドを使って同期ラッパーを生成しています。

using System;
using System.Collections;

public class Demo {
   public static void Main(){
      SortedList sortedList = new SortedList();
      sortedList.Add("1", "Tom");
      sortedList.Add("2", "Ryan");
      sortedList.Add("3", "Nathan");

      Console.WriteLine("SortedList elements...");
      foreach(DictionaryEntry d in sortedList){
         Console.WriteLine("Key = "+d.Key + ", Value = " + d.Value);
      }

      // 同期ラッパーを作成
      SortedList sortedList2 = SortedList.Synchronized(sortedList);
      Console.WriteLine("SortedList is synchronized? = "+sortedList2.IsSynchronized);
   }
}

出力結果

SortedList elements...
Key = 1, Value = Tom
Key = 2, Value = Ryan
Key = 3, Value = Nathan
SortedList is synchronized? = True

実行結果を見ると、Synchronized()メソッドで生成したオブジェクトのIsSynchronizedプロパティがTrueになっていることがわかります。つまり、このコレクションはスレッドセーフに操作できる状態です。

例2:同期されていない通常のSortedListの場合

次に、比較のためにSynchronized()メソッドを使わずに作成した通常のSortedListの動作を確認してみましょう。

using System;
using System.Collections;

public class Demo {
   public static void Main(){
      SortedList sortedList = new SortedList();
      sortedList.Add("1", "AB");
      sortedList.Add("2", "CD");
      sortedList.Add("3", "EF");
      sortedList.Add("4", "GH");
      sortedList.Add("5", "IJ");
      sortedList.Add("6", "KL");

      Console.WriteLine("SortedList elements...");
      foreach(DictionaryEntry d in sortedList){
         Console.WriteLine("Key = "+d.Key + ", Value = " + d.Value);
      }

      Console.WriteLine("SortedList is synchronized? = "+sortedList.IsSynchronized);
   }
}

出力結果

SortedList elements...
Key = 1, Value = AB
Key = 2, Value = CD
Key = 3, Value = EF
Key = 4, Value = GH
Key = 5, Value = IJ
Key = 6, Value = KL
SortedList is synchronized? = False

こちらの場合、IsSynchronizedプロパティはFalseを返します。これは、通常の方法で作成されたSortedListは同期されておらず、マルチスレッド環境で安全に共有できないことを示しています。

ポイントまとめ

  • SortedList.Synchronized(元のコレクション)を呼び出すと、スレッドセーフな同期ラッパーが返される。
  • IsSynchronizedプロパティで、コレクションが同期されているかどうかを判定できる。
  • 同期ラッパー経由での列挙処理を行う場合でも、複数スレッドからの読み書きが混在する場合は、列挙中に明示的にコレクションをロックすることが推奨される。
  1. C#でSortedListオブジェクトに特定の値が含まれているかどうかを確認する方法

    C#のSortedListオブジェクトに特定の値が含まれているかどうかを確認するには、ContainsValueメソッドを使用します。このメソッドは、指定した値がSortedList内に存在する場合はtrue、存在しない場合はfalseを返します。以下に具体的なコード例を示します。コード例1using System; using System.Collections; public class Demo {    public static void Main(){       SortedList list = new SortedList(

  2. AIは人間の仕事を「生み出す」のか、それとも「奪う」のか?

    自動化技術がこれまで多くの職を失わせてきたことは事実ですが、AI(人工知能)については同じ結論にはならないかもしれません。一般的な認識とは裏腹に、最新の研究では、AIマシンは導入初期の段階においてむしろ人手を必要とすることが示唆されています。確かにAIには、ウェブ検索、ほぼすべての言語での会話や翻訳、ポーカー対戦など、人間を上回る能力が数多くあります。しかし、だからといって機械がすぐに私たちに取って代わるわけではないのです。納得できない方は、この先を読んでみてください。その理由をいくつかご紹介しましょう。まず何より、AIマシンは論理的なトリガーと、行動の根拠となる情報源がなければ動き出すことが