<ThrowUnobservedTaskExceptions> Elemen

Menentukan apakah pengecualian tugas yang tidak tertangani harus mengakhiri proses yang sedang berjalan.

<configuration>
  <runtime>
    <ThrowUnobservedTaskExceptions>

Syntax

<ThrowUnobservedTaskExceptions
   enabled="true|false"/>

Atribut dan Elemen

Bagian berikut menjelaskan atribut, elemen turunan, dan elemen induk.

Attributes

Attribute Description
enabled Atribut yang diperlukan.

Menentukan apakah pengecualian tugas yang tidak tertangani harus mengakhiri proses yang sedang berjalan.

Atribut yang diaktifkan

Nilai Description
false Tidak mengakhiri proses yang sedang berjalan untuk pengecualian tugas yang tidak tertangani. Ini adalah default.
true Mengakhiri proses yang sedang berjalan untuk pengecualian tugas yang tidak tertangani.

Elemen Anak

Tidak ada.

Elemen Induk

Elemen Description
configuration Elemen akar di setiap file konfigurasi yang digunakan oleh runtime dan aplikasi .NET Framework.
runtime Berisi informasi tentang opsi inisialisasi runtime.

Komentar

Jika pengecualian yang terkait dengan Task belum diamati, tidak Wait ada operasi, induk tidak dilampirkan, dan Task.Exception properti tidak membaca pengecualian tugas dianggap tidak ditayangkan.

Dalam .NET Framework 4, secara default, jika Task yang memiliki pengecualian yang tidak ditayangkan adalah sampah yang dikumpulkan, finalizer melemparkan pengecualian dan mengakhiri proses. Penghentian proses ditentukan oleh waktu pengumpulan dan finalisasi sampah.

Untuk mempermudah pengembang menulis kode asinkron berdasarkan tugas, .NET Framework 4.5 mengubah perilaku default ini untuk pengecualian yang tidak ditangguhkan. Pengecualian yang tidak ditayangkan masih menyebabkan UnobservedTaskException peristiwa dinaikkan, tetapi secara default, proses tidak berakhir. Sebaliknya, pengecualian diabaikan setelah peristiwa dinaikkan, terlepas dari apakah penanganan aktivitas mengamati pengecualian.

Di .NET Framework 4.5, Anda dapat menggunakan <ThrowUnobservedTaskExceptions> elemen dalam file konfigurasi aplikasi untuk mengaktifkan perilaku .NET Framework 4 untuk melemparkan pengecualian.

Anda juga dapat menentukan perilaku pengecualian dengan salah satu cara berikut:

  • Dengan mengatur variabel COMPlus_ThrowUnobservedTaskExceptions lingkungan (set COMPlus_ThrowUnobservedTaskExceptions=1).

  • Dengan mengatur nilai DWORD registri ThrowUnobservedTaskExceptions = 1 di kunci HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework.

Contoh 1

Contoh berikut menunjukkan cara mengaktifkan pelemparan pengecualian dalam tugas dengan menggunakan file konfigurasi aplikasi.

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

Contoh 2

Contoh berikut menunjukkan bagaimana pengecualian yang tidak ditayangkan dilemparkan dari tugas. Kode harus dijalankan sebagai program yang dirilis agar berfungsi dengan benar.

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

Lihat juga