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

标签 c# multithreading list

在并行运行的对象集合上执行相同功能的最有效方法是什么?我知道我可以在一个循环中执行 new Thread(() => MyFunc(myParam)).Start(),但是有更好的方法吗?这似乎是一种非常丑陋的做法。

最佳答案

[...] is there a better way? This seems like a very ugly way of doing it.

是的,这是一种非常丑陋且低效的方式。每个线程都会消耗大量资源,但您的计算机只能同时执行 N 个线程,其中 N 是您计算机上的 CPU 核心数。因此,您可以在优化线程数量以适应 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循环:

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

并行for循环:

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

关于c# - 运行任意数量的函数,每个函数都在自己的线程上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30551087/

相关文章:

C# - 如何获得两个没有标识符的列表的补充

python - 在 Python 中随机化列表

Python 列表迭代到一行

c# - Udpclient 变量不断重置为 Null ASP.NET

java - 单行函数是否需要大括号?

c# - 我需要哪种亚马逊服务来简单查询书名、ISBN 和出版商?

python - 如何直接在python代码中的tesseract中配置OMP_THREAD_LIMIT以禁用多处理?

java - 如何组织一系列运行任务?

python - Python 中的信号处理

list - 通过as.character()将列表强制转换为字符时,为什么会出现这种行为?