C# 立即退出c中的并行For循环#
在C#中,是否可以立即退出正在进行的并行.For循环。调用loopState.Stop()后,以下代码可能需要整整一秒钟才能退出循环C# 立即退出c中的并行For循环#,c#,.net,multithreading,.net-4.0,parallel-processing,C#,.net,Multithreading,.net 4.0,Parallel Processing,在C#中,是否可以立即退出正在进行的并行.For循环。调用loopState.Stop()后,以下代码可能需要整整一秒钟才能退出循环 static void Main(string[] args) { Stopwatch watch = new Stopwatch(); Parallel.For(0, 50, (i, loopState) => { Console.WriteLine("Thread:" + Thread.CurrentThread
static void Main(string[] args)
{
Stopwatch watch = new Stopwatch();
Parallel.For(0, 50, (i, loopState) =>
{
Console.WriteLine("Thread:" + Thread.CurrentThread.ManagedThreadId + "\tIteration:" + i);
Thread.Sleep(1000);
if (i == 0)
{
watch.Start();
loopState.Stop();
return;
}
});
Console.WriteLine("Time Elapsed since loopState.Stop(): {0}s", watch.Elapsed.TotalSeconds);
Console.ReadKey();
}
输出
Thread:10 Iteration:0
Thread:6 Iteration:12
Thread:11 Iteration:24
Thread:12 Iteration:36
Thread:13 Iteration:48
Thread:13 Iteration:49
Thread:12 Iteration:37
Time Elapsed since loopState.Stop(): 0.9999363s
有什么方法可以更快地做到这一点吗?
谢谢 是的,这是可能的。请看一篇详细介绍并行编程问题的文章。以下是其中的一段摘录: 如果我不想浪费资源,想停止一切 单击“取消”后立即计算?在这种情况下,我必须 定期检查取消令牌的状态 在执行长时间运行操作的方法中。自从我 将取消令牌声明为字段,我只需在 方法
public-double-SumRootN(int-root)
{
双结果=0;
对于(int i=1;i<10000000;i++)
{
tokenSource.Token.ThrowIfCancellationRequested();
结果+=Math.Exp(Math.Log(i)/root);
}
返回结果;
}
使用传统的停止
或中断
不会像您所经历的那样导致任务立即取消。根据MSDN上的文章
在此上下文中,“中断”意味着在所有线程上完成所有迭代
在当前线程上的当前迭代之前,以及
然后退出循环。“停止”意味着一旦停止所有迭代
方便
所以你不能用传统的方法强迫它立即停止。你需要使用我在开头提到的方法
希望这对你有帮助 是的,这是可能的。请看一篇详细介绍并行编程问题的文章。以下是其中的一段摘录: 如果我不想浪费资源,想停止一切 单击“取消”后立即计算?在这种情况下,我必须 定期检查取消令牌的状态 在执行长时间运行操作的方法中。自从我 将取消令牌声明为字段,我只需在 方法
public-double-SumRootN(int-root)
{
双结果=0;
对于(int i=1;i<10000000;i++)
{
tokenSource.Token.ThrowIfCancellationRequested();
结果+=Math.Exp(Math.Log(i)/root);
}
返回结果;
}
使用传统的停止
或中断
不会像您所经历的那样导致任务立即取消。根据MSDN上的文章
在此上下文中,“中断”意味着在所有线程上完成所有迭代
在当前线程上的当前迭代之前,以及
然后退出循环。“停止”意味着一旦停止所有迭代
方便
所以你不能用传统的方法强迫它立即停止。你需要使用我在开头提到的方法
希望这对你有帮助 问题在于循环体的运行时间
loopState.Stop()
从一开始就停止任何新的循环迭代,并等待当前正在运行的任何循环完成。问题在于循环体的运行时间loopState.Stop()
从一开始就停止任何新的循环迭代,并等待当前正在运行的任何循环迭代完成。不幸的是,我的高性能调用位于第三方库中,但我可以使用此技术稍微提高性能。谢谢不要理会最后的评论。这实际上在性能上产生了巨大的差异。虽然我使用loopState.ShouldExitCurrentIteration而不是tokenSource。不幸的是,我的高性能调用位于第三方库中,但我可以使用此技术稍微提高性能。谢谢不要理会最后的评论。这实际上在性能上产生了巨大的差异。虽然我使用loopState.ShouldExitCurrentIteration而不是tokenSource。
public double SumRootN(int root)
{
double result = 0;
for (int i = 1; i < 10000000; i++)
{
tokenSource.Token.ThrowIfCancellationRequested();
result += Math.Exp(Math.Log(i) / root);
}
return result;
}