Sil*_*ght 4 c# .net-4.0 console-application parallel.foreach
如何在Parallel.Foreach中定义计数器并停止以特定数量消耗?
我问了这个问题,因为Parallel.ForEach中的那个计数器在常规操作中不起作用.
请看这个小例子:
static void Main(string[] args)
{
int Count_Step = -1;
string[] lines = new string[]
{
"0",
"1",
"2",
"3",
"4",
"5",
"6",
"7",
"8",
"9",
"10",
"11",
"12",
"13",
"14",
"15",
"16",
"17",
"18",
"19"
};
List<string> list_lines = new List<string>(lines);
ParallelOptions parallelOptions = new ParallelOptions();
parallelOptions.MaxDegreeOfParallelism = 3;
Parallel.ForEach(list_lines, parallelOptions, (line, state, index) =>
{
if (Count_Step == 10)
state.Stop();
Count_Step++;
Console.WriteLine(index + " : " + line + " : " + Count_Step);
//Thread.Sleep(5000);
});
Console.ReadLine();
}
Run Code Online (Sandbox Code Playgroud)
我想输出10行,而不是更多!
我怎样才能做到这一点?
提前致谢
Jod*_*ell 11
如果你只想输出10行代替,
static void Main(string[] args)
{
var lines = new List<string>
{
"0",
"1",
"2",
"3",
"4",
"5",
"6",
"7",
"8",
"9",
...
};
var parallelOptions = new ParallelOptions
{
MaxDegreeOfParallelism = 3
};
Parallel.ForEach(lines.Take(10), parallelOptions, (line, index) =>
{
Console.WriteLine("{0} : {1}", index, line);
////Thread.Sleep(5000);
});
Console.ReadLine();
}
Run Code Online (Sandbox Code Playgroud)
或者
static void Main(string[] args)
{
var lines = new List<string>
{
"0",
"1",
"2",
"3",
"4",
"5",
"6",
"7",
"8",
"9",
...
};
var parallelOptions = new ParallelOptions
{
MaxDegreeOfParallelism = 3
};
Parallel.For(0, 9, parallelOptions, i =>
{
Console.WriteLine("{0} : {1}", i, lines[i]);
////Thread.Sleep(5000);
});
Console.ReadLine();
}
Run Code Online (Sandbox Code Playgroud)
甚至
static void Main(string[] args)
{
var lines = new List<string>
{
"0",
"1",
"2",
"3",
"4",
"5",
"6",
"7",
"8",
"9",
...
};
Enumerable.Range(0, 10).AsParallel().WithDegreeOfParallelism(3).ForAll(i =>
{
Console.WriteLine("{0} : {1}", i, lines[i]);
////Thread.Sleep(5000);
}
Console.ReadLine();
}
Run Code Online (Sandbox Code Playgroud)
如果您真的希望并行迭代更新循环外的某些值,那么您需要确保更改变量的所有更新和读取都是线程安全的.
如果你正在递增一个整数,你可以像这样做.
var stepCount = 0;
Enumerable.Range(0, 10).AsParallel().WithDegreeOfParallelism(3).ForAll(i =>
{
var thisCount = Interlocked.Increment(ref stepCount);
Console.WriteLine("{0} : {1} : {2}", i, lines[i], thisCount);
////Thread.Sleep(5000);
}
Console.ReadLine();
Run Code Online (Sandbox Code Playgroud)
但是,thisCount在控制台窗口中输出不是连续的,在两条线之间可能有一个线程切换.
如果你想做更复杂的事情,比如取消处理部分,你应该看看BlockingCollection.
| 归档时间: |
|
| 查看次数: |
10183 次 |
| 最近记录: |