Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 立即退出c中的并行For循环#_C#_.net_Multithreading_.net 4.0_Parallel Processing - Fatal编程技术网

C# 立即退出c中的并行For循环#

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

在C#中,是否可以立即退出正在进行的并行.For循环。调用loopState.Stop()后,以下代码可能需要整整一秒钟才能退出循环

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;
}