C#のQueue.Synchronized()メソッドとは?使い方とサンプルコードを解説
C#のQueue.Synchronized()メソッドは、元のキューをラップしたスレッドセーフな新しいQueueを返すためのメソッドです。複数のスレッドから同時にキューへアクセスする可能性がある場合に利用することで、安全な操作が可能になります。
構文
Queue.Synchronized()メソッドの構文は以下の通りです。
public static System.Collections.Queue Synchronized (System.Collections.Queue queue);
引数「queue」には、同期化の対象となるキューを指定します。戻り値として、元のキューをラップしたスレッドセーフなQueueオブジェクトが返されます。
サンプルコード①:文字列キューの場合
まずは基本的な使用例を見てみましょう。
using System;
using System.Collections;
public class Demo {
public static void Main(){
Queue queue = new Queue();
queue.Enqueue("AB");
queue.Enqueue("BC");
queue.Enqueue("CD");
queue.Enqueue("DE");
queue.Enqueue("EF");
queue.Enqueue("FG");
queue.Enqueue("GH");
queue.Enqueue("HI");
Console.WriteLine("Queue...");
IEnumerator demoEnum = queue.GetEnumerator();
while (demoEnum.MoveNext()){
Console.WriteLine(demoEnum.Current);
}
Console.WriteLine("Is Queue synchronized? = "+queue.IsSynchronized);
Queue queue2 = Queue.Synchronized(queue);
Console.WriteLine("Is Queue synchronized now? = "+queue2.IsSynchronized);
}
}
実行結果①
上記のコードを実行すると、次のような出力が得られます。
Queue...
AB
BC
CD
DE
EF
FG
GH
HI
Is Queue synchronized? = False
Is Queue synchronized now? = True
この例では、元のキュー「queue」のIsSynchronizedプロパティはFalseですが、Queue.Synchronized()メソッドで生成した「queue2」はTrueになっていることが確認できます。つまり、queue2がスレッドセーフなキューであることを示しています。
サンプルコード②:数値キューの場合
続いて、別の例を見てみましょう。今度は整数を要素とするキューに対して、Contains()メソッドやCopyTo()メソッドも併せて使用しています。
using System;
using System.Collections;
public class Demo {
public static void Main(){
Queue queue = new Queue();
queue.Enqueue(100);
queue.Enqueue(200);
queue.Enqueue(300);
Console.WriteLine("Is Queue synchronized? = "+queue.IsSynchronized);
Queue queue2 = Queue.Synchronized(queue);
Console.WriteLine("Is Queue synchronized now? = "+queue2.IsSynchronized);
Console.Write("Count of elements = ");
Console.WriteLine(queue.Count);
Console.WriteLine("Queue...");
foreach(int i in queue){
Console.WriteLine(i);
}
Console.WriteLine("Does the queue has element 500? = "+queue.Contains(500));
int[] intArr = new int[5];
intArr[0] = 1;
intArr[1] = 2;
intArr[2] = 3;
intArr[3] = 4;
queue.CopyTo(intArr, 1);
Console.WriteLine("\nQueue (Updated)");
foreach(int i in queue){
Console.WriteLine(i);
}
Console.WriteLine("\nArray (Updated)");
foreach(int i in intArr){
Console.WriteLine(i);
}
}
}
実行結果②
このコードを実行すると、以下の出力が得られます。
Is Queue synchronized? = False
Is Queue synchronized now? = True
Count of elements = 3
Queue...
100
200
300
Does the queue has element 500? = False
Queue (Updated)
100
200
300
Array (Updated)
1
100
200
300
0
この例からも、Queue.Synchronized()メソッドを呼び出した後のキューはIsSynchronizedプロパティがTrueになり、スレッドセーフな状態になっていることが分かります。また、CopyTo()メソッドを使えば、キューの内容を配列の指定位置以降へコピーできることも確認できます。マルチスレッド環境で非ジェネリックのQueueを扱う際は、このメソッドによる同期化を検討するとよいでしょう。
-
C#のAggregateメソッドとは?配列要素を集計・演算する方法を解説
C#のLINQに用意されているAggregate(集計)メソッドを使うと、Sum(合計)、Min(最小値)、Max(最大値)、Average(平均)といった数学的な演算を柔軟に実装できます。Aggregateメソッドは、ラムダ式で指定した処理をシーケンスの各要素に順番に適用し、最終的に1つの結果へと集約します。ここでは、配列の全要素を掛け合わせる例を通して、その使い方を見ていきましょう。サンプル:配列要素の積を求めるまずは、次のような整数型の配列を用意します。int[] arr = { 10, 15, 20 };この配列に対して、Aggregate()メソッドを次のように呼び出します。 x *
-
C#のTakeWhileメソッドの使い方をわかりやすく解説
C#のLINQに用意されているTakeWhile()メソッドを使うと、Predicate(述語)で指定した条件が成立している間、シーケンスの先頭から要素を取得することができます。 このメソッドは、条件を満たす限り先頭から順に要素を取り出し、最初に条件を満たさなくなった要素に到達した時点で処理を停止するという特徴があります。そのため、配列の途中に条件外の要素があると、それ以降の要素はたとえ条件を満たしていても取得されない点に注意が必要です。 TakeWhile()メソッドの基本的な使い方 まず、整数型の配列を宣言して初期化します。 int[] arr = { 25, 40, 65, 70 };