ワーカスレッドを安全に終了させるまで待機
Posted feedbacks - C#
C# では Delegate.BeginInvoke を使うとスレッドプール内のスレッドが使われるので、今回はそれを使ってみました。今回は複数タスクを待機するので、AsyncWaitHandle の配列を WaitHandle.WaitAll メソッドに渡しています。いろんな意味であまり好ましくない実装ですが……。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | using System;
using System.Collections.Generic;
using System.Threading;
static class Program {
static void Main() {
Console.WriteLine("start.");
WaitCallback func = delegate(object obj) { // 実行されるタスク
Console.WriteLine("start: {0}", obj);
Thread.Sleep(new Random().Next(5, 10) * 1000);
Console.WriteLine("finish: {0}", obj);
};
List<WaitHandle> waitHandles = new List<WaitHandle>();
for(int i = 0; i < 10; i++) {
waitHandles.Add(func.BeginInvoke(i, null, null).AsyncWaitHandle);
}
WaitHandle.WaitAll(waitHandles.ToArray()); // メインスレッドはここで待機
Console.WriteLine("join.");
}
}
|


todogzm
#4822()
Rating4/4=1.00
スレッドプールに複数のワーカスレッドが待機しており、メインスレッドはいつでもワーカスレッドに仕事を渡せるような状態になっているとします。
さて、メインスレッドからスレッドプールにいくつか仕事を与え、メインスレッドは与えた仕事すべてが終了するまで待機し、次の処理に行ってはいけない、というようなコードを書いてください。 #現実に書く機会が多そうなコードですね…。
ここでの仕事の内容は、適当に5秒から15秒の間スレッドをスリープする、というもので結構です。 また、ワーカスレッドのスレッドプール自体の使用を終了するか、または残して再利用するかは問いません。できればコメントにスレッドプールを残したかどうかを書いてください。
[ reply ]