Parallel.For
Visual Studio 2010 Express 日本語版が出ましたね!
次期Visual Studio 2010と.NET Framework 4.0の新機能 で気になってた Parallel.For を試してみました。
using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { var list = new SynchronizedCollection<string>(); Parallel.For(0, 10, delegate(int i) { list.Add(i.ToString()); }); Debug.WriteLine(string.Join(",", list.ToArray())); } } }
出力:
0,1,3,4,5,6,7,8,9,2
ちゃんと並列処理されてるみたいです。
List のインスタンスメンバはスレッドセーフではないので SynchronizedCollection を使用する必要があります(System.ServiceModel の参照の追加が必要)。
それから、同じことが AsParallel を使ってもできます。
static void Main(string[] args) { var list = new SynchronizedCollection<string>(); Enumerable.Range(0, 10).AsParallel().ForAll(i => { list.Add(i.ToString()); }); Debug.WriteLine(string.Join(",", list.ToArray())); }
- -
Taskクラスの仕様が記事掲載時から変更されたようです。Task.Factory.StartNew を使います。
int num = 0; Task task1 = Task.Factory.StartNew(delegate { num++; }); Task task2 = Task.Factory.StartNew(delegate { num++; }); Task task3 = Task.Factory.StartNew(delegate { num++; }); Debug.WriteLine(num); // ほぼ 0。 Sleep 入れると変わるけど。 Task.WaitAll(new[] { task1, task2, task3 }); Debug.WriteLine(num); // 必ず 3