1

我正在经历非常奇怪的行为,我既无法理解也无法解释。我能够创建一个非常简单的示例来证明这一点。这是在 VS.Net 2013 和 2015 上在具有多个目标 .Net 版本的不同机器上复制的。

using System;
using System.Linq;

namespace Sample
{
    internal static class Program
    {
        private static void Main(string[] args)
        {
            ExecuteInParallel(new[]
            {
                new Tuple<string, Action>("Task1", () => { }),
                new Tuple<string, Action>("Task2", () => { throw new Exception("Exception"); })
            });
        }

        private static void ExecuteInParallel(Tuple<string, Action>[] tasks)
        {
            tasks.AsParallel().ForAll(x =>
            {
                Console.WriteLine("Starting " + x.Item1);
                x.Item2();
            });
        }
    }
}

当您只运行该代码而不进行调试时,您会收到预期的结果:两个任务已启动,一个失败,以及控制台中的 AggregateException 详细信息:

Starting Task1
Starting Task2

Unhandled Exception: System.AggregateException: One or more errors occurred. ---> System.Exception: Exception
   at Sample.Program.<Main>b__1() in d:\temp\ConsoleApplication40\ConsoleApplication40\Program.cs:line 13
...

但是当你开始调试相同的代码时,结果真的很奇怪。首先,您收到 AggregateException:

VS.2013 聚合异常

但是当您单击继续时,它只会一次又一次地启动这两个任务 - 这是控制台的示例输出:

Starting Task1
Starting Task2
Starting Task1
Starting Task2
Starting Task1
Starting Task2
Starting Task1
Starting Task2

我正在使用两个任务来证明它们都在重新启动;您可以注释掉一个空的并收到同样令人困惑的结果。

我的问题是 - 这是一个 VS.Net 错误,还是我不理解的某些功能?

有没有办法在这里以“正常”的方式进行调试?

4

1 回答 1

0

我可以在我这边重现这个问题,真正的问题是整个 .exe/程序没有像退出控制台应用程序时经常收到的消息那样退出:

程序“[xxx] ConsoleApplication12.vshost.exe”已退出,代码为 0 (0x0)。

要真正的反驳它,比如,不是真的用F5调试你的应用,只用F11(Step Into)(一步一步调试应用)调试你的应用,你会发现应用后无法退出第二个例外显示。

另一种证明方法是您可以在以下代码中添加 try...catch:

          tasks.AsParallel().ForAll(x =>
            {
                Console.WriteLine("Starting " + x.Item1);
                x.Item2();
            });

然后再次调试您的应用程序,您会发现它不会再次输出消息并且应用程序已退出,即使它仍然有第一个异常 在此处输入图像描述

更新:我只是发现一个调试选项确实会影响问题。 如果我禁用此选项,则在该弹出窗口中单击“中断”或“继续”后,它将不会再次调试该应用程序。

在此处输入图像描述

于 2016-12-26T10:15:33.147 回答