m2

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