<Elemento ThrowUnobservedTaskExceptions>

Specifica se le eccezioni di attività non gestite devono comportare l'arresto di un processo in esecuzione.

<Configurazione>
  <Runtime>
    <ThrowUnobservedTaskExceptions>

Sintassi

<ThrowUnobservedTaskExceptions  
   enabled="true|false"/>  

Attributi ed elementi

Nelle sezioni seguenti vengono descritti gli attributi, gli elementi figlio e gli elementi padre.

Attributi

Attributo Descrizione
enabled Attributo obbligatorio.

Specifica se le eccezioni di attività non gestite devono comportare l'arresto del processo in esecuzione.

Attributo enabled

Valore Descrizione
false Non termina il processo in esecuzione per un'eccezione di attività non gestita. Questo è il valore predefinito.
true Termina il processo in esecuzione per un'eccezione di attività non gestita.

Elementi figlio

Nessuno.

Elementi padre

Elemento Descrizione
configuration Elemento radice in ciascun file di configurazione usato in Common Language Runtime e nelle applicazioni .NET Framework.
runtime Contiene informazioni sulle opzioni di inizializzazione in fase di esecuzione.

Commenti

Se un'eccezione associata a un oggetto Task non è stata osservata, non esiste alcuna operazione Wait, l'elemento padre non è associato, la proprietà Task.Exception non è stata letta e l'eccezione di attività viene considerata non osservata.

Per impostazione predefinita, in .NET Framework 4, se un oggetto con un'eccezione Task non gestita viene garbage collection, il finalizzatore genera un'eccezione e termina il processo. L'interruzione del processo è determinata dall'intervallo di Garbage Collection e finalizzazione.

Per semplificare la scrittura di codice asincrono in base alle attività, .NET Framework 4.5 modifica questo comportamento predefinito per le eccezioni non rilevate. Le eccezioni non osservate comportano ancora la generazione dell'evento UnobservedTaskException, ma, per impostazione predefinita, il processo non viene terminato. Invece, l'eccezione viene ignorata dopo la generazione dell'evento, indipendentemente dal fatto che l'eccezione venga rilevata da un gestore eventi.

In .NET Framework 4.5 è possibile usare l'elemento ThrowUnobservedTaskExceptions> in un file di configurazione dell'applicazione per abilitare il< comportamento di .NET Framework 4 per generare un'eccezione.

Il comportamento dell'eccezione può anche essere specificato in uno dei modi seguenti:

  • Impostando la variabile di ambiente COMPlus_ThrowUnobservedTaskExceptions (set COMPlus_ThrowUnobservedTaskExceptions=1).

  • Impostando il valore DWORD ThrowUnobservedTaskExceptions = 1 del Registro di sistema nella chiave HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework.

Esempio 1

Nell'esempio seguente viene illustrato come abilitare la generazione di eccezioni nelle attività tramite un file di configurazione dell'applicazione.

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

Esempio 2

Nell'esempio seguente viene illustrata la modalità di generazione di un'eccezione non osservata da parte di un'attività. Il codice deve essere eseguito come programma rilasciato per funzionare correttamente.

using System;
using System.Threading;
using System.Collections.Generic;
using System.Threading.Tasks;

//Use the following config settings to enable the throwing of unobserved exceptions.
//    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
//    <ThrowUnobservedTaskExceptions enabled="true"/>

public class Example
{
    static void Main()
    {
        Task.Run(() => { throw new InvalidOperationException("test"); });
        while (true)
        {
            Thread.Sleep(100);
            GC.Collect();
            GC.WaitForPendingFinalizers();
        }
    }
}
Imports System.Threading
Imports System.Threading.Tasks

'Use the following config settings to enable the throwing of unobserved exceptions.
'    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
'    <ThrowUnobservedTaskExceptions enabled="true"/>

Public Class Example
    Shared Sub Main()
        Task.Run(Sub() Throw New InvalidOperationException("test"))
        Do
            Thread.Sleep(100)
            GC.Collect()
            GC.WaitForPendingFinalizers()
        Loop
    End Sub
End Class

Vedi anche