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

デバッグせずにそのコードを実行すると、期待どおりの結果が得られます: 2 つのタスクが開始され、1 つが失敗し、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 AggregateException

ただし、[続行] をクリックすると、両方のタスクが何度も開始されます。コンソールからのサンプル出力は次のとおりです。

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

2 つのタスクを使用して、両方が再起動していることを示していました。空のものをコメントアウトして、同じ紛らわしい結果を受け取ることができます。

ここで私の質問 - これは VS.Net のバグですか、それとも私が理解できない機能ですか?

ここで「通常の」方法でデバッグする方法はありますか?

4

1 に答える 1

0

私の側でこの問題を再現できます。実際の問題は、コンソール アプリが終了した場合によく表示されるメッセージのように、.exe/プログラム全体が終了しなかったことです。

プログラム '[xxx] ConsoleApplication12.vshost.exe' はコード 0 (0x0) で終了しました。

たとえば、F5 を使用してアプリを実際にデバッグするのではなく、F11 (ステップ イン) (アプリを 1 ステップずつデバッグ) を使用してアプリをデバッグするだけで、実際に再確認するには、アプリを終了できなかったことがわかります。 2番目の例外が示されました。

それを証明する別の方法は、次のコードに try...catch を追加することです。

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

その後、アプリを再度デバッグすると、最初の例外がまだ残っている場合でも、再度メッセージが出力されず、アプリが終了したことがわかります。 ここに画像の説明を入力

更新: 1 つのデバッグ オプションが実際に問題に影響を与えることがわかりました。 このオプションを無効にすると、そのポップ ウィンドウで [Break] または [Continue] をクリックした後、再度アプリをデバッグすることはできません。

ここに画像の説明を入力

于 2016-12-26T10:15:33.147 に答える