<ThrowUnobservedTaskExceptions> 요소

작업 예외가 처리되지 않으면 실행 중인 프로세스를 종료할지를 지정합니다.

<configuration>
  <runtime>
    <ThrowUnobservedTaskExceptions>

구문

<ThrowUnobservedTaskExceptions  
   enabled="true|false"/>  

특성 및 요소

다음 섹션에서는 특성, 자식 요소 및 부모 요소에 대해 설명합니다.

특성

attribute Description
enabled 필수 특성입니다.

처리되지 않은 작업 예외가 실행 중인 프로세스를 종료해야 하는지 여부를 지정합니다.

enabled 특성

Description
false 처리되지 않은 작업 예외에 대해 실행 중인 프로세스를 종료하지 않습니다. 기본값입니다.
true 처리되지 않은 작업 예외에 대해 실행 중인 프로세스를 종료합니다.

자식 요소

없음

부모 요소

요소 Description
configuration 공용 언어 런타임 및 .NET Framework 애플리케이션에서 사용하는 모든 구성 파일의 루트 요소입니다.
runtime 런타임 초기화 옵션에 대한 정보를 포함합니다.

설명

Task와 연결된 예외가 관찰되지 않은 경우 Wait 작업이 없고 부모가 연결되지 않으며 Task.Exception 속성을 읽지 않은 경우 작업 예외는 관찰되지 않은 것으로 간주됩니다.

.NET Framework 4에서 기본적으로 관찰되지 않은 예외가 있는 Task가 가비지 수집되는 경우 종료자는 예외를 throw하고 프로세스를 종료합니다. 프로세스의 종료는 가비지 수집 및 종료 시점에 따라 결정됩니다.

개발자가 작업을 기반으로 비동기 코드를 더 쉽게 작성할 수 있도록 .NET Framework 4.5는 관찰되지 않는 예외에 대해 이 기본 동작을 변경합니다. 관찰되지 않은 예외는 여전히 UnobservedTaskException 이벤트를 발생시키지만 기본적으로 프로세스는 종료되지 않습니다. 대신 이벤트 처리기가 예외를 관찰하는지 여부에 관계없이 이벤트가 발생한 후 예외가 무시됩니다.

.NET Framework 4.5에서는 애플리케이션 구성 파일의 <ThrowUnobservedTaskExceptions> 요소를 사용하여 예외를 발생시키는 .NET Framework 4 동작을 사용하도록 설정할 수 있습니다.

다음 방법 중 하나로 예외 동작을 지정할 수도 있습니다.

  • 환경 변수 COMPlus_ThrowUnobservedTaskExceptions(set COMPlus_ThrowUnobservedTaskExceptions=1)을 설정합니다.

  • HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework 키에서 레지스트리 DWORD 값 ThrowUnobservedTaskExceptions = 1을 설정합니다.

예 1

다음 예에서는 애플리케이션 구성 파일을 사용하여 작업에서 예외를 throw하는 방법을 보여 줍니다.

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

예제 2

다음 예에서는 관찰되지 않은 예외가 작업에서 throw되는 방법을 보여 줍니다. 코드가 제대로 작동하려면 릴리스된 프로그램으로 실행해야 합니다.

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

참고 항목