运行任意数量的函数,每个函数都在自己的线程上

时间:2015-05-30 20:32:08

标签: c# multithreading list

在对象集合上执行相同功能的最有效方法是什么,每个对象并行运行?我知道我可以在循环中做#!/usr/bin/perl use utf8; use strict; use warnings 'all'; use open qw/ :std :encoding(utf-8) /; use autodie; use Text::CSV; my $csv = Text::CSV->new({ binary => 1, sep_char => ';' }); open my $fh, '<', 'test.csv'; while ( my $row = $csv->getline($fh) ) { print "@$row\n"; } close $fh; 但是有更好的方法吗?这似乎是一种非常难看的做法。

2 个答案:

答案 0 :(得分:8)

  

[...]有更好的方法吗?这似乎是一种非常难看的做法。

是的,这是一种非常丑陋且低效的方式。每个线程将消耗大量资源,但您的计算机只能在N是计算机上的CPU核心数的同时执行N个线程。因此,不是像线程那样使用低级原语,而是可以在库之上构建,以优化线程数以适应CPU核心数。

如果您有一组对象,我建议:

LINQ代码:

var result = source.Select(item => ...).ToList();

并行LINQ代码:

var result = source.AsParallel().Select(item => ...).ToList();

对于每个循环:

foreach (var item in source)
  Process(item);

每个循环并行:

Parallel.ForEach(
  source,
  item => Process(item);
);

For loop:

for (var i = 0; i < list.Count; i += 1)
  list[i] = Process(list[i]);

并行循环:

Parallel.For(
  0,
  list.Count,
  i => {
    list[i] = Process(list[i]);
  }
);

答案 1 :(得分:2)

您可以从.net 4.0开始使用Parallel.ForParallel.ForeachParallel.Invoke

从.Net4.0开始,很少有理由直接在代码中使用Thread。您可以使用TPL,这是实现任务并行或数据并行的推荐方法。

引用Stephen Cleary

中的his book
  

只要您输入new Thread(),它就会结束;你的项目已经有了   遗留代码