Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
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();
}