Bagikan melalui


dangerousThreadingAPI 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.

dangerousThreadingAPI asisten penelusuran kesalahan terkelola (MDA) diaktifkan saat metode Thread.Suspend dipanggil pada utas selain utas saat ini.

Gejala

Aplikasi tidak responsif. Data sistem atau aplikasi mungkin dibiarkan dalam keadaan tidak terduga untuk sementara atau bahkan setelah aplikasi dimatikan. Beberapa operasi tidak selesai seperti yang diharapkan.

Gejala dapat sangat bervariasi karena keacakan yang melekat pada masalah.

Penyebab

Sebuah utas ditangguhkan secara asinkron oleh utas lain menggunakan metode Suspend. Tidak ada cara untuk menentukan waktu aman untuk menangguhkan utas lain yang mungkin berada di tengah-tengah operasi. Menangguhkan utas dapat mengakibatkan kerusakan data atau pemutusan invarian. Jika utas ditempatkan ke status ditangguhkan dan tidak pernah dilanjutkan menggunakan metode Resume, aplikasi dapat berhenti merespons dan mungkin merusak data aplikasi. Metode ini telah ditandai sebagai usang.

Jika primitif sinkronisasi dipegang oleh utas target, upaya tersebut tetap ditahan selama penangguhan. Cara ini dapat menyebabkan kebuntuan jika utas lain, misalnya utas yang melakukan Suspend, mencoba mendapatkan kunci pada primitif. Dalam situasi ini, masalah memanifestasikan dirinya sebagai kebuntuan.

Resolusi

Hindari desain yang memerlukan penggunaan Suspend dan Resume. Untuk kerja sama antar alur, gunakan primitif sinkronisasi seperti Lock, , MonitorReaderWriterLock, Mutex, atau pernyataan Clock#. Jika Anda harus menggunakan metode ini, kurangi jendela waktu dan minimalkan jumlah kode yang dijalankan saat utas dalam status ditangguhkan.

Efek pada Runtime

MDA ini tidak berpengaruh pada runtime bahasa umum. MDA hanya melaporkan data tentang operasi pengaluran yang berbahaya.

Output

MDA mengidentifikasi metode pengaluran berbahaya yang menyebabkannya diaktifkan.

Konfigurasi

<mdaConfig>
  <assistants>
    <dangerousThreadingAPI />
  </assistants>
</mdaConfig>

Contoh

Contoh kode berikut menunjukkan panggilan ke metode Suspend yang menyebabkan aktivasi dangerousThreadingAPI.

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

Lihat juga