На странице 33 книги Стивена Тоуба
http://www.microsoft.com/download/en/details.aspx?id=19222
Есть код
var pings = from addr in addrs.AsParallel().WithDegreeOfParallelism(16)
select new Ping().Send(addr);
foreach (var ping in pings)
Console.WriteLine("{0}: {1}", ping.Status, ping.Address);
и по словам Стивена лучший вариант
var pings = (from addr in addrs
select new Ping().SendTask(addr, null)).ToArray();
Task.WaitAll(pings);
foreach (Task ping in pings)
Console.WriteLine("{0}: {1}", ping.Result.Status, ping.Result.Address);
Стивен говорит, что второй вариант лучше, потому что "Абстракция задачи также может быть использована для представления операций, связанных с вводом/выводом и без связывания потока в "
Но разве задача не использует Threadpool (следовательно, все равно использует потоки)? То есть вы фактически связываете поток?