0

Ich habe eine App .NET4 läuft auf einer .NET4.6.1 Maschine ist mit folgenden app.config Targeting:Warum wird die TaskScheduler.UnobservedTaskException nicht ausgelöst?

<configuration> 
    <runtime> 
    <ThrowUnobservedTaskExceptions enabled="true"/> 
    </runtime> 
</configuration> 

ich dann versuchen Sie folgendes erwarten ausführen, um die Nachricht Boom!: .... zu sehen:

static void Main(string[] args) 
{ 
    SetupUnobservedTaskExceptionHandling(); 

    var task = Task.Factory.StartNew(() => 
     { 
      Console.WriteLine("Task started"); 
      var innerException = new InvalidOperationException("No way!"); 
      throw new ApplicationException("Ooops!", innerException); 
     }); 

    Thread.Sleep(1000); 

    // The task should be in faulted state before collection for the exception event to bubble up 
    Console.WriteLine($"Task Status: {task.Status}"); 

    GC.Collect(); 
    GC.WaitForPendingFinalizers(); 

    GC.KeepAlive(task); 

    Console.ReadLine(); 
} 

[HandleProcessCorruptedStateExceptions] 
public static void SetupUnobservedTaskExceptionHandling() 
{ 
    Console.WriteLine("Setting up unobserved task exception handling..."); 
    TaskScheduler.UnobservedTaskException += (sender, args) => 
    { 
     Console.WriteLine("Boooom!: {0}", args); 
    }; 
    Console.WriteLine("Set up unobserved task exception handling."); 
} 

Aber das Ereignis nie ausgelöst unabhängig von einem Build-Typ Debug oder Release. Was ist los?

+1

Entfernen Sie das 'GC.KeepAlive (Task);' – PetSerAl

+1

Außerdem muss Release verwenden, da Debug lokale var Lebensdauern für Debuggability erweitert. – usr

Antwort

1

Um das erwartete Verhalten achievethe Sie die Kommentare oben folgen und GC.KeepAlive(task) entfernen, während Veröffentlichung mit

oder

Sie task = null; vor dem Aufruf GC.Collect(); festlegen können, diese Aufgabe zu gewährleisten, wird gesammelt. Here können Sie eine andere verwandte Antwort finden, die möglicherweise weitere Details hinzufügen.