Bagikan melalui


asynchronousThreadAbort MDA

Catatan

Artikel ini khusus untuk .NET Framework. Ini tidak berlaku untuk implementasi .NET yang lebih baru, termasuk .NET 6 dan versi yang lebih baru.

asynchronousThreadAbort asisten debug terkelola (MDA) diaktifkan saat utas mencoba memasukkan pembatalan asinkron ke utas lain. Pembatalakuan utas sinkron tidak mengaktifkan asynchronousThreadAbort MDA.

Gejala

Aplikasi mogok dengan ThreadAbortException yang tidak tertangani saat utas aplikasi utama dibatalkan. Jika aplikasi terus dijalankan, konsekuensinya mungkin lebih buruk daripada aplikasi yang crash, mungkin mengakibatkan kerusakan data lebih lanjut.

Operasi yang dimaksudkan sebagai atomik kemungkinan telah terganggu setelah penyelesaian parsial, meninggalkan data aplikasi dalam keadaan yang tidak dapat diprediksi. ThreadAbortException dapat dihasilkan dari titik yang tampaknya acak dalam eksekusi kode, seringkali di tempat-tempat di mana pengecualian tidak diharapkan muncul. Kode mungkin tidak mampu menangani pengecualian tersebut, yang mengakibatkan status rusak.

Gejala dapat sangat bervariasi karena keacakan yang melekat pada masalah.

Penyebab

Kode dalam satu utas yang disebut metode Thread.Abort pada utas target untuk memperkenalkan pembatalan utas asinkron. Pembatalakuan utas tidak sinkron karena kode yang melakukan panggilan ke Abort berjalan pada utas yang berbeda dari target operasi pembatalakuan. Pembatalakuan utas sinkron seharusnya tidak menyebabkan masalah karena utas yang melakukan Abort seharusnya dilakukan hanya pada titik pemeriksaan yang aman di mana status aplikasi konsisten.

Pembatalan utas asinkron menimbulkan masalah karena diproses pada titik yang tidak dapat diprediksi dalam eksekusi utas target. Untuk menghindari hal ini, kode yang ditulis untuk berjalan pada utas yang mungkin dibatalkan dengan cara ini perlu menangani ThreadAbortException hampir setiap baris kode, berhati-hatilah untuk menempatkan data aplikasi kembali ke status yang konsisten. Tidak realistis untuk mengharapkan kode ditulis dengan masalah ini dalam pikiran atau menulis kode yang melindungi dari semua kemungkinan keadaan.

Panggilan ke kode tak terkelola dan blok finally tidak akan dibatalkan secara asinkron tetapi segera setelah keluar dari salah satu kategori ini.

Penyebabnya mungkin sulit ditentukan karena keacakan yang melekat pada masalah.

Resolusi

Hindari desain kode yang memerlukan penggunaan abort utas asinkron. Ada beberapa pendekatan yang lebih sesuai untuk gangguan utas target yang tidak memerlukan panggilan ke Abort. Yang paling aman adalah memperkenalkan mekanisme, seperti properti umum, yang menandakan utas target untuk meminta gangguan. Utas target memeriksa sinyal di titik pemeriksaan aman tertentu. Jika melihat bahwa gangguan telah diminta, interupsi dapat dimatikan dengan lancar.

Efek pada Runtime

MDA ini tidak berpengaruh pada runtime bahasa umum. Ini hanya melaporkan data tentang pembatalan utas asinkron.

Output

MDA melaporkan ID utas yang melakukan pembatalan dan ID utas yang merupakan target pembatalan. Ini tidak akan pernah sama karena ini terbatas pada pembatalan asinkron.

Konfigurasi

<mdaConfig>
  <assistants>
    <asynchronousThreadAbort />
  </assistants>
</mdaConfig>

Contoh

Mengaktifkan MDA asynchronousThreadAbort hanya memerlukan panggilan ke Abort pada utas yang berjalan terpisah. Pertimbangkan konsekuensinya jika konten fungsi mulai utas adalah serangkaian operasi yang lebih kompleks yang mungkin terganggu pada titik arbitrer apa pun oleh pembatalan.

using System.Threading;
void FireMda()
{
    Thread t = new Thread(delegate() { Thread.Sleep(1000); });
    t.Start();
    // The following line activates the MDA.
    t.Abort();
    t.Join();
}

Lihat juga