Bagikan melalui


Elemen <ThrowUnobservedTaskExceptions>

Menentukan apakah pengecualian tugas yang tidak ditangani harus menghentikan proses yang sedang berjalan.

<konfigurasi>
  <runtime>
    <ThrowUnobservedTaskExceptions>

Sintaks

<ThrowUnobservedTaskExceptions  
   enabled="true|false"/>  

Atribut dan Elemen

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

Atribut

Atribut Deskripsi
enabled Atribut yang diperlukan.

Menentukan apakah pengecualian tugas yang tidak ditangani harus menghentikan proses yang sedang berjalan.

Atribut yang diaktifkan

Nilai Deskripsi
false Tidak menghentikan proses yang sedang berjalan untuk pengecualian tugas yang tidak ditangani. Ini adalah default.
true Mengakhiri proses yang sedang berjalan untuk pengecualian tugas yang tidak ditangani.

Elemen Anak

Tidak ada.

Elemen Induk

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

Keterangan

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

Di .NET Framework 4, secara default jika Task yang memiliki pengecualian yang tidak teramati adalah sampah yang dikumpulkan, finalizer menampilkan pengecualian dan menghentikan proses. Penghentian proses ditentukan oleh waktu pengumpulan dan finalisasi sampah.

Untuk memudahkan pengembang menulis kode asinkron berdasarkan tugas, .NET Framework 4.5 mengubah perilaku default ini untuk pengecualian yang tidak teramati. Pengecualian yang tidak teramati masih menyebabkan peristiwa UnobservedTaskException dimunculkan, tetapi secara default, proses tidak dihentikan. Sebaliknya, pengecualian diabaikan setelah peristiwa dimunculkan, terlepas dari apakah penanganan peristiwa mengamati pengecualian.

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

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

  • Dengan mengatur variabel lingkungan COMPlus_ThrowUnobservedTaskExceptions (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 penampilan pengecualian dalam tugas menggunakan file konfigurasi aplikasi.

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

Contoh 2

Contoh berikut menunjukkan cara pengecualian yang tidak teramati ditampilkan 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