我对Parallel.ForEach有点困惑。 什么是平行。ForEach,它到底做什么? 请不要引用任何MSDN链接。

这里有一个简单的例子:

string[] lines = File.ReadAllLines(txtProxyListPath.Text);
List<string> list_lines = new List<string>(lines);

foreach (string line in list_lines)
{
    //My Stuff
}

我如何用Parallel.ForEach重写这个例子?


当前回答

这些台词对我很管用。

string[] lines = File.ReadAllLines(txtProxyListPath.Text);
var options = new ParallelOptions { MaxDegreeOfParallelism = Environment.ProcessorCount * 10 };
Parallel.ForEach(lines , options, (item) =>
{
 //My Stuff
});

其他回答

这些台词对我很管用。

string[] lines = File.ReadAllLines(txtProxyListPath.Text);
var options = new ParallelOptions { MaxDegreeOfParallelism = Environment.ProcessorCount * 10 };
Parallel.ForEach(lines , options, (item) =>
{
 //My Stuff
});

对于大文件,使用以下代码(您不太需要内存)

Parallel.ForEach(File.ReadLines(txtProxyListPath.Text), line => {
    //Your stuff
});
var concurrentList = new ConcurrentBag<Dto>();
var opts = new ParallelOptions { MaxDegreeOfParallelism = Convert.ToInt32(Math.Ceiling((Environment.ProcessorCount * 0.65) * 1.0)) }; 

Parallel.ForEach(data,
                 opts,
                 row => {
                        var processResult = process each row    
                        concurrentList.Add(processResult);
                        }
                        );
string[] lines = File.ReadAllLines(txtProxyListPath.Text);

// No need for the list
// List<string> list_lines = new List<string>(lines); 

Parallel.ForEach(lines, line =>
{
    //My Stuff
});

这将导致在循环中并行地解析行。如果您想要更详细、更少“面向引用”的Parallel类介绍,我写了一个关于TPL的系列文章,其中包含了关于Parallel. foreach的部分。

我想补充一些平行选项。如果你没有提到它,默认情况下所有的RAM都将用于此,这可能会在生产中给你带来问题。所以最好在代码中添加最大并行度。

Parallel.ForEach(list_lines, new ParallelOptions { MaxDegreeOfParallelism = 2 }, line =>
{
    
});