在C#中,是否可以立即退出正在进行的Parallel.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

有什么办法可以更快地做到这一点?
谢谢!

最佳答案

是的,这可能。请参阅this文章,该文章详细介绍了并行编程问题。这是您摘录的摘录:


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

使用传统的StopBreak不会导致您立即遇到任务被取消的情况。根据MSDN上this的文章,



因此,您不能使用传统方法强制其立即停止。您将需要使用开头提到的方法。

希望这对您有所帮助!

关于c# - 立即退出C#中的Parallel.For循环,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14720014/

10-11 22:24