gpt4 book ai didi

c# - 当一个线程匹配到 if 语句时,如何跳出 parallel.for 循环?

转载 作者:行者123 更新时间:2023-11-30 13:53:44 34 4
gpt4 key购买 nike

所以在我的program我希望第一个完成第一个值的线程显示在控制台中,然后让所有剩余的线程中止。这是我现在拥有的演示该问题的代码。

    public static void test()
{
int Loop = 0;

Parallel.For(0, 2000, new ParallelOptions() { MaxDegreeOfParallelism = Environment.ProcessorCount }, (i, End) =>
{
Loop++;
Console.WriteLine(Loop);

if (Loop == 1000)
{
Console.WriteLine("Break!");
End.Break();
}
});
}

当它完成后,这里是输出到控制台的片段

985
987
983
Break!
Break!
992
998
Break!
Break!
00:00:00.7217394

所以现在我不知道如何让它在一个线程匹配 if 语句时一起停止。任何帮助将不胜感激!

最佳答案

Parallel.Forxxx 支持CancellationToken。只需创建一个 CancellationTokenSource,将其分配给 ParallelOptions 的一个实例,然后在循环期间,您可以在需要时触发它。

public static void test()
{
int Loop = 0;

CancellationTokenSource cts = new CancellationTokenSource();

try
{
Parallel.For(0, 2000,
new ParallelOptions()
{
MaxDegreeOfParallelism = Environment.ProcessorCount,
CancellationToken = cts.Token
},
(i, End) =>
{
cts.Token.ThrowIfCancellationRequested();

// ...

if (i == 1000) // you should be using 'i'
{
Console.WriteLine("Break!");
cts.Cancel();
}
});
}
catch (OperationCanceledException )
{
// expected behaviour
}
}

正如 TheGeneral 所说,您的循环不是线程安全的,因此我进行了一些更改并留出空间供您填充。

告诉我更多

关于c# - 当一个线程匹配到 if 语句时,如何跳出 parallel.for 循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53112906/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com